axios 정의
axios는 HTTP 클라이언트 라이브러리로써, 비동기 방식으로 HTTP 데이터 요청을 실행한다. 내부적으로 직접 XMLHttpRequest를 사용하지 않고 AJAX 호출을 할수있다.
그리고 axios는 Promise 기반 api이다.
api는 따로 관리한다.
axios를 사용할 vue 페이지에서 직접 import axios
를 통해서 사용하지 않고 api 파일을 따로 작성하여 해당 메소드를 호출 하는 방식으로 설계를 한다.
api에서는 직접 then 및 catch 작업을 하지 않는다.
아래와 같이 호출만 하고 Promise를 return 하는 방식으로 작성한다.
1 | function test() { |
API 작성 방법
1. 기본 HTTP Request & Response와 관련된 기본설정을 한다.
1 | const config = { |
2. API 함수들을 정리한다.
1 | export const getRoleList = function() { |
라우터 네비게이션 가드
데이터를 호출 시점은 여러가지가 존재한다. 대표적으로 라이프 사이클 중 하나인 created와 지금 소개할 라우터 네이게이션 가드가 존재한다. 상황에 따라
적절한 위치에서 데이터를 호출 해서 사용 하면 된다.
정의
라우터 네비게이션 가드란 vue-router가 제공하는 기능으로 주로 리다이렉션 또는 라우터 이동을 취하여서 네비게이션을 보호하는데 사용한다. 라우터 네비게이션 가드는
created보다 먼저 호출이 된다.
사용방법
라우터에서 직접 사용
1 | var routed = { |
params 또는 쿼리의 변경에 의해서는 가드가 실행되지 않는다.
next의 사용
1. next()
네이게이션을 승인 해준다. 라우터의 URL 이동을 허락 해준다.
2. next(false)
네이게이션을 중단한다. from 경로의 URL로 재설정된다.
3. next(‘/‘) or next({path : ‘/‘})
다른 위치로 리다이렉션 해 준다.
4. next(error)
next에 전달된 인자가 Error의 인스턴스이면 탐색 중단 및 router.onError()를 이용해 등록 된 콜백에 에러가 전달 된다.
가드의 종류
1. 전역 가드 : beforeEnter
2. 글로벌 가드 : beforeResolve, afterEach
3. 내부가드 : beforeRouteEnter, beforeRouteUpdate, beforeRouteLeave
내부가드는 router가 아닌 컴포넌트 안에 직접 네비게이션 가드를 정의할수 있다.
beforeRouterEnter
는 해당 가드 생성시에 컴포넌트 생성 전이라 this에 접근이 불가능하다.
1 | var component = { |
beforeRouteLeave
는 this에 직접 접근이 가느하다. 사용자가 저장하지 않는 편집 내용을 두고 라우트를 떠나는 것을 방지할때 사용한다.
전체 네비게이션 시나리오
1 | 1) 네비게이션이 트리거됨. |
라우터 객체
router 객체
라우터 객체를 이용한 주소변경
앞서서 <view-link to="">
를 활용한 주소변경에 대해서는 알아보았습니다. 하지만 때론 자바스크립트로 주소변경을 해야 하는 경우가 발생할수 있습니다.
이런 경우에는 this.$router.push('주소')
을 이용하여 주소를 이동할수 있습니다.
1 | <button @click="onClik">클릭</button> |
히스토리 목록에 추가하지 않고 주소 변경
push를 이용하면 히스토리 목록에 추가가 됩니다. 하지만 replace를 이용하면 목록에 추가 되지 않습니다.($router.go 메서드를 이용해서 이전 주소로 이동이 불가능합니다.)
1 | <router-link to="주소" replace></router-link> <!-- 선언적 방식은 속성으로 replace를 추가 --> |
$router는 VueRouter인스턴스 입니다.
route 객체
$route.params
동적라우팅으로 데이터를 받거나 push등을 통해서 params에 데이터를 저장한 경우에 this.$route.params.데이터
를 통해서 데이터를 얻어 올수 있습니다.
1 | <script> |
$route.query
push등을 통해서 query에 데이터를 저장한 경우에 this.$route.query.데이터
를 통해서 데이터를 얻어 올수 있습니다.
1 | <script> |
동적 라우팅
블로그 주소를 /post/포스트번호
로 설계하여 포스트번호가 동적으로 변화하여야 하는 경우에는 동적으로 라우팅을 설정해야 합니다. 동적으로 주소를 사용할땐 주소 앞에 :
를 사용합니다.
동적 라우팅 구성
1 | var routes = [ |
/post/001
,/post/002
처럼 동적으로 접근 가능
게시판에서 게시글 상세보기 접근할때 해당하는 동적 주소 사용 가능
동적 라우팅으로 구성한 데이터 접근
동적으로 작성된 주소의 데이터는 this.$route.params.데이터명
으로 접근이 가능합니다.
1 | <script> |
props로 데이터 접근
동적 라우팅으로 구성한 데이터를 props로 가져 올수 있다. this.$route.params.데이터명
로 하면 라우트와의 의존성이 높아지므로 props를 활용하는게 좋다.
1 | var routes = [ |
URL에 동적 데이터 구성 이외에도 queryString 방식도 이용 가능 하다.
1. url 작성
1 | url : /user?id=userId |
2. 라우터 작성
1 | var routes = [{ |
3. 값 받아오기
1 | this.$route.query.id |
4. props로 받아오기
키가 id 값을 props에 userName이라는 키로 변환하여 보내주고 있다.
1 | var routes = [{ |
뷰 라우터
싱글페이지앱에서는 화면의 새로고침이 없이 페이지가 전환이 되어야 합니다. 그럴때 사용하는 것이 뷰 라우터로써 라우트에 컴포넌트를 맵핑 시켜 놓고 특정주소에서 해당하는 컴포넌트를 렌더링하는 방식으로 싱글페이지앱에서 페이지의 전환을 대신합니다.
1. vue-router 구성
1-1. vue-router파일 작성
참고사항
vue-router의 실제 코드를 main.js에 작성하게 되면 vue-router 편향적인 파일이 되기 때문에 삼가한다. vue-router만을 위한 파일을 생성하여 작성하도록 하자.
vue-router 설치
1 | npm install vue-router |
import
1 | import Vue from 'vue'; |
컴포넌트 생성
렌더링할 컴포넌트 생성
1 | const Foo = {template: '<p>foo</p>'} |
VueRouter 생성
path는 주소, component는 해당 주소에서 렌더링할 컴포넌트를 맵핑
1 | let routes = [ |
1-2. main.js 작성
Vue 인스턴스 생성
1 | import {router} from '라우터작성 경로'; |
뷰 라우터 태그 작성
라우터 설정시에 맵핑했었던 컴포넌트가 router-view에 렌더링 됩니다.
1 | <div id="app"> |
라우터 이동
path부분에 주소를 입력 해주면 해당 라우팅 경로로 이동할수 있습니다(실제론 해당 주소로 컴포넌트를 바꿔서 렌더링 작업을 처리해준다는 것).
1 | <div id="app"> |
redirect
path 경로로 들어왔을 때 리다이렉트 할수 있다.
1 | var routes = [ |
url에 # 제거하기
mode에 history값을 주면 #을 제거 가능하다.
1 | new VueRouter({ |
2. 심화된 라우팅 구성
중첩된 라우트
중첩된 라우트를 사용하기 위해서는 children 속성을 이용하면 가능합니다.
1 | var routes = [ |
중첩된 라우트는 화면 구성 컴포넌트의 수가 적으면 유용하지만 한번에 더 많은 컴포넌트를 표시하는데는 한계가 있습니다.
다중 라우트
하나의 주소에 여러개의 컴포넌트와 매핑을 합니다.
1 | <view-router></view-router> |
상하위 관계가 아닌 동등한 레벨의 여러개의 컴포넌트를 한번에 표시가 가능합니다.
component 확장해서 사용하기
extends는 기존 컴포넌트를 확장해서 유사한 컴포넌트를 만들수 있는 방법입니다.
1 | /* Hello.vue */ |
extends를 사용할 경우 data, computed, methods, filters는 오버라이딩이 된다. 하지만 라이프사이클은 모두 순서대로 호출이 된다.
vue를 사용하게 되면 DOM요소에 대한 관리를 vue가 해주기 때문에 직접 접근할 일이 드물지만, 특별한 케이스에 한해서 DOM 요소에 접근을 해야할 경우가 생길수 있습니다.
1. DOM 요소에 접근
1 | <template> |
this.$refs.ref이름
으로 DOM요소에 접근 가능
2. 자식 컴포넌트의 메서드 호출
1 | <template> |