Vue Router
- Vue의 공식 라우터
- SPA 상에서 라우팅을 쉽게 개발할 수 있는 기능을 제공
- 라우트(routes)에 컴포넌트를 매핑한 후, 어떤 URL에서 렌더링 할지 알려줌
- 즉, SPA를 MPA처럼 URL을 이동하면서 사용 가능
- SPA의 단점 중 하나인 "URL이 변경되지 않는다"를 해결
$ vue create vue-router-app
$ cd vue-router-app
$ vue add router
- 기존에 프로젝트를 진행하고 있던 도중에 router를 추가하게 되면 App.vue를 덮어쓰므로 필요한 경우 명령을 실행하기 전에 파일을 백업해두어야 함
[History mode]
![](https://velog.velcdn.com/images/yoon-dh/post/a2856abc-eeca-4d18-b2a9-45a20f54930b/image.png)
- 브라우저의 History API를 활용한 방식
- 새로고침 없이 URL 이동 기록을 남길 수 있음
- 우리에게 익숙한 URL 구조로 사용 가능
- History mode를 사용하지 않으면 Default 값인 hash mode로 설정('#'을 통해 URL을 구분하는 방식)
[App.vue]
![](https://velog.velcdn.com/images/yoon-dh/post/0cf368a6-36d1-4564-9016-1ed4085f607b/image.png)
![](https://velog.velcdn.com/images/yoon-dh/post/1dd455d7-ee20-4a59-ae61-6cc359cc5f67/image.png)
- router/index.js
- views 폴더 생성
[router-link]
- a태그와 비슷한 기능 ==> URL을 이동시킴
- routes에 등록된 컴포넌트와 매핑
- 히스토리 모드에서 router-link는 클릭 이벤트로 차단하여 a태그와 달리 브라우저가 페이지를 다시 로드 하지 않도록 함
- 목표 경로는 'to' 속성으로 지정됨
- 기능에 맞게 HTML에서 a태그로 rendering 되지만, 필요에 따라 다른 태그로 바꿀 수 있음
[router-view]
- 주어진 URL에 대해 일치하는 컴포넌트를 렌더링 하는 컴포넌트
- 실제 component가 DOM에 부착되어 보이는 자리를 의미
- router-link를 클릭하면 routes에 매핑된 컴포넌트를 렌더링
- django에서의 block tag와 비슷함
- App.vue == base.html
- router-view == block 태그로 감싼 부분
[src/router/index.js]
![](https://velog.velcdn.com/images/yoon-dh/post/973f0a8c-13e2-402a-a843-5ca96b211afd/image.png)
- 라우터에 관련된 정보 및 설정이 작성되는 곳
- Django에서의 urls.py에 해당
- routes에 URL과 컴포넌트를 매핑
[src/Views]
- router-view에 들어갈 component 작성
- 기존에 컴포넌트를 작성하던 곳은 components 폴더 뿐이었지만 이제 두 폴더로 나뉘어짐
- 각 폴더 안의 .vue 파일들이 기능적으로 다른 것은 아님
- 폴더별 컴포넌트 배치는 다음과 같이 진행
- views/
- routes에 매핑되는 컴포넌트, 즉 router-view 태그의 위치에 렌더링되는 컴포넌트를 모아두는 폴더
- 다른 컴포넌트와 구분하기 위해 View로 끝나도록 파일이름 만드는 것 권장
- components/
- routes에 매핑된 컴포넌트의 하위 컴포넌트를 모아두는 폴더
Vue Router 주소 이동
- 선언적 방식 네비게이션
- 프로그래밍 방식 네비게이션
[1.선언적 방식 네비게이션]
파일 경로 ==> App.vue
![](https://velog.velcdn.com/images/yoon-dh/post/8ac81f06-5b47-4edb-9182-0fd1d2110c4b/image.png)
- router-link의 'to' 속성으로 주소 전달
- routes에 등록된 주소와 매핑된 컴포넌트로 이동
![](https://velog.velcdn.com/images/yoon-dh/post/8aec17f8-633b-4409-ba6f-9d23fde2e1ce/image.png)
- Named Routes
- 이름을 가지는 routes
- Django에서 path 함수의 name 인자의 활용과 같은 방식
![](https://velog.velcdn.com/images/yoon-dh/post/ee7db95a-b254-468a-b561-a8b36574f2b2/image.png)
- 동적인 값을 사용하기때문에 v-bind를 사용해야 정상적으로 작동
[2.프로그래밍 방식 네비게이션]
![](https://velog.velcdn.com/images/yoon-dh/post/8110fb58-c028-4632-99b1-b8d6df6aca20/image.png)
- Vue 인스턴스 내부에서 라우터 인스턴스에 $router 로 접근할 수 있음
- 다른 URL로 이동하려면 this.$router.push 를 사용
- history stack에 이동할 URL을 넣는 방식
- history stack에 기록이 남기 때문에 사용자가 브라우저의 뒤로가기 버튼을 클릭하면 이전 URL로 이동할 수 있음
- 결국 router-link :to="..." 를 클릭하는 것과 $router.push(...)를 호출하는 것은 같은 동작
[Dynamic Route Matching]
파일 경로 ==> router/index.js
![](https://velog.velcdn.com/images/yoon-dh/post/2b212fdb-965b-47e6-b7af-2876b019784e/image.png)
파일 경로 ==> HellowView.vue
![](https://velog.velcdn.com/images/yoon-dh/post/e67421e2-4ca4-4187-8146-3faa09541201/image.png)
- HelloView.vue 작성 및 route를 추가
- route를 추가할 때 동적 인자를 명시
![](https://velog.velcdn.com/images/yoon-dh/post/b02e9fe1-39c4-4664-9c27-cd31843676ad/image.png)
- $route.params 로 변수에 접근 가능
- HTML에서 직접 사용하기보다는 data에 넣어서 사용하는 것을 권장
[선언적 방식 네비게이션]
![](https://velog.velcdn.com/images/yoon-dh/post/382c55f7-15ed-4e28-9ef1-0ca73e3d13da/image.png)
[프로그래밍 방식 네비게이션]
![](https://velog.velcdn.com/images/yoon-dh/post/42fbf6f5-4532-438c-9a71-54bb1bb8c2b8/image.png)
- AboutView에서 데이터를 입력 받아 HelloView로 이동하여 입력받은 데이터에게 인사하기
[route에 컴포넌트를 등록하는 또다른 방법]
![](https://velog.velcdn.com/images/yoon-dh/post/64972858-7f43-4400-aee7-12bca193b23b/image.png)
- route/index.js에 컴포넌트를 등록하는 또 다른 방식이 주어지고 있음(about)
- lazy loading
- 모든 파일을 한번에 로드하려고 하면 모든 걸 다 읽는 시간이 매우 오래 걸림
- 미리 로드를 하지 않고 특정 라우트에 방문할 때 매핑된 컴포넌트의 코드를 로드하는 방식을 활용할 수 있음
- 모든 파일을 한 번에 로드하지 않아도 되기 때문에 최초에 로드하는 시간이 빨라짐
- 당장 사용하지 않을 컴포넌트는 먼저 로드하지 않는 것이 핵심