본문 바로가기
  • 살짝 구운 김 유나
Web/Vue.js

Vue Router

by yunae 2022. 11. 9.

Routing

: 네트워크에서 경로를 선택하는 프로세스

웹 서비스에서의 라우팅 ? => 유저가 방문한 URL에 대해 적절한 결과를 응답하는 것

 

Routing in SSR - Server가 모든 라우팅을 통제
- URL로 요청이 들어오면 응답으로 완성된 HTML 제공
=> 결론적으로, Routing에 대한 결정권을 서버가 가짐
Routing in SPA/CSR - 서버는 하나의 HTML만을 제공
- 이후에 모든 동작은 하나의 HTML 문서 위에서 Javascript 코드를 활용
=> 즉, 하나의 URL만 가질 수 있음

 

 

Routing 이 없다면,

  • 유저가 URL을 통한 페이지의 변화를 감지할 수 X
  • 페이지가 무엇을 렌더링 중인지에 대한 상태를 알 수 X
  • (새로고침하면 처음 페이지로, 링크를 공유하면 처음페이지만 공유 가능)
  • 브라우저의 뒤로 가기 기능을 사용할 수 X

 

 

Vue Router

: Vue의 공식 라우터

  • SPA 상에서 라우팅을 쉽게 개발할 수 있는 기능 제공
  • 라우트에 컴포넌트를 매핑한 후, 어떤 URL에서 렌더링 할지 알려줌 

=> 즉 , SPA를 URL을 이동하면서 사용 가능, SPA의 단점 중 하나인 "URL이 변경되지 않는다"를 해결

 

 

 

Vue Router 시작하기

 

1. 설치 및 반영

$ vue create (프로젝트 명)  // vue 프로젝트 생성

$ cd (프로젝트 명)          // 디렉토리 이동

$ vue add router             // Vue CLI를 통해 router plugin 적용

/*
기존에 프로젝트를 진행하고 있던 도중에 router를 추가하게 되면 App.vue를 덮어쓰므로
필요한 경우에는 명령 실행 전에 파일을 백업해두어야 함
*/

 

 

2. History mode 사용 여부

  • 브라우저의 History API를 활용한 방식 => 새로고침 없이 URL 이동 기록을 남길 수 있음
  • 우리에게 익숙한  URL 구조로 사용 가능 => ex) http://localhost:8080/index

[참고]

history mode를 사용하지 않으면 Default 값인 hash mode로 설정됨 ('#' 을 통해 URL을 구분하는 방식)

  • ex) http://localhost:8080#index

 

 

3 . App.vue - router-link 요소 및 router-view가 추가됨

4. router/index.js 와 views 폴더가 생성됨

5. 서버 실행하기

 

 

router-link

a 태그와 비슷한 기능 -> URL을 이동시킴

  • routes에 등록된 컴포넌트와 매핑됨
  • 히스토리 모드에서 router-link는 클릭 이벤트를 차단하여 a 태그와 달리 브라우저가 페이지를 다시 로드하지 않도록 함

목표 경로는 'to' 속성으로 지정됨

기능에 맞게 HTML에서 a 태그로 rendering 되지만, 필요에 따라 다른 태그로 바꿀 수 있음

 

 

 

router-view

  • 주어진 URL에 대해 일치하는 컴포넌트를 렌더링 하는 컴포넌트
  • 실제 component가 DOM에 부착되어 보이는 자리를 의미
  • router-link를 클릭하면 routes에 매핑된 컴포넌트를 렌더링

 

 

src/router/index.js

: URL로 라우터 링크가 이동했을때 어떤 컴포넌트를 보여줄지 작성

  • 라우터에 관련된 정보 및 설정이 작성되는 곳
  • Django의 urls.py에 해당
  • routes에 URL와 컴포넌트를 매핑

 

 

src/Views

  • router-view에 들어갈  component 작성
  • 기존에 컴포넌트를 작성하던 곳은 components, views 두 폴더로 나뉘어짐
  • 각 폴더 안의 .vue 파일들이 기능적으로 다른 것은 아님 (단지, 분리를 위함)

[권장사항]

views/ - routes에 매핑되는 컴포넌트
즉, <router-view>의 위치에 렌더링 되는 컴포넌트를 모아두는 폴더
- 다른 컴포넌트와 구분하기 위해 View 로 끝나도록 만드는 것을 권장
components/ - routes에 매핑된 컴포넌트의 하위 컴포넌트를 모아두는 폴더

 

 

Vue Router 사용하기

 

주소를 이동하는 2가지 방법

 

 

 

1. 선언적 방식 네비게이션

router-link의 'to' 속성으로 주소 전달 -> routes에 등록된 주소와 매핑된 컴포넌트로 이동

 

 

 

2. 프로그래밍 방식 네비게이션

- Vue 인스턴스 내부에서 라우터 인스턴스에 $router로 접근 할 수 있음

- 다른 URL로 이동: this.$router.push

  • history stack에 이동할 URL을 넣는 방식
  • history stack에 기록이 남기 때문에 사용자가 브라우저의 뒤로 가기 버튼을 클릭하면 이전 URL로 이동할 수 있음

왼 : 선언적 방식, 오: 프로그래밍 방식

=> 오른쪽 링크와 버튼을 클릭하는 것은 같은 동작을 수행하는 것!

 

 

 

 

Dynamic Route Matching

동적 인자 전달 => URL의 특정 값을 변수처럼 사용할 수 있음

 

 

route 추가 - 추가 시에 동적인자 명시 (콜론)

 

 

$route.params로 변수에 접근 가능

-> HTML에서 직접 사용하기 보다는 data에 넣어서 사용하는 것을 권장

 

 

 params를 이용하여 동적 인자 전달 가능

실행결과

 

 

 

" 데이터를 입력받아 HellowView로 이동하여 입력받은 데이터에게 인사하기 " 

데이더 입력받기
실행 결과

 

 

 

 

lazy-loading

 

라우터에 컴포넌트를 등록하는 또 다른 방법

모든 파일을 한 번에 로드하려고 하면 모든 걸 다 읽는 시간이 매우 오래 걸림

 

=> 미리 로드를 하지 않고 특정 라우트에 방문할 때 매핑된 컴포넌트의 코드를 로드하는 방식을 활용

  • 모든 파일을 한 번에 로드하지 않아도 되기 때문에 최초에 로드하는 시간이 빨라짐
  • 당장 사용하지 않을 컴포넌트는 먼저 로드하지 않는 것이 핵심

 

 

 

 

 

 

 

 

'Web > Vue.js' 카테고리의 다른 글

Vuex  (0) 2022.11.10
Navigation Guard  (0) 2022.11.09
Vue Component  (0) 2022.11.02
Vue CLI  (0) 2022.11.02
Template Syntax  (0) 2022.11.01

댓글