업데이트:

VUE ROUTER

vue.js 공식 라우터

설치

//vue 2.x
> npm install vue-router

//vue 3.x
> vue add router

추가방법

// main.js
import Vue from "vue";
import App from "./App.vue";
import VueRouter from "vue-router"; // vue-router를
Vue.use(VueRouter); // vue에 추가.

import appMain from "./compoenets/app-main.vue";

const router = new VueRouter({
  mode: "history", //기본 해시모드에서, 해시를 제거.
  routes: [
    { path: "경로", component: "컴포넌트명", name: "별칭" }, //라우터 상세 설정.
    { path: "/main", component: appMain } //name 속성은 선택 값.
  ]
});

new Vue({
  el: "#app",
  router, //상단에서 선언한 변수를 vue 인스턴스에 추가.
  render: h => h(App)
});
//template //화면표시
<router-view></router-view>

//네비게이션 구성
<ul>
  <router-link tag="li" to="/" active-class="[class name]" exact>
    <a>Home</a></router-link
  >
  <router-link tag="li" to="/intro" active-class="[class name]">
    <a>Intro</a>
  </router-link>
</ul>

router에 설정한 컴포넌트와 매칭되는 URL일 경우, <router-view></router-view>에 해당 컴포넌트 화면이 노출됨.

<router-link>속성

  • exact 메인화면의 경우, <a href=”/”>Main</a> 와 같은 경로를 갖는데, 다른 서브페이의 경로에도 ‘/’ 문자가 포함되어
    정확한 ‘/’ 경로를 구분하지 못함. 이때 사용하는 것이 exact 속성임.
  • tag=”li” <router-link>로 작성하고, 브라우저상에서는 <li>로 렌더링 하고자 할때 사용.
  • to=”path” 이동하고자 하는 경로.
  • active-class=”class name” 해당 메뉴의 활성화 class를 정의.

동적 라우트 매칭

{path:'/user/:id' ...}
// 예)
// '/user/[something]'
// '/user/123'
// '/user/foo'
// '/user/bar'

하위(중첩) 라우터 정의

//특정 컴포넌트의 하위 라우터를 children 속성에 배열로 선언.
{path : '/user', component : 'user', children : [
	//user 컴포넌트에 <router-view> 에 출력됨.
	{path : '/foo', component : 'userFoo'},
	{path : '/bar', component : 'userBar'}
]};

name 속성

router 설정에서 component 별칭을 지정할 수 있음.

<router-link :to="{name : 'home'}"></router-link>
//router
{path : '/', name : 'home', components : Home}

//component(.vue)
export default {
	data (){
		return{}
	},
	methods : {
		clickFunc (){
			this.$router.push({name : 'home'}); //home으로 이동
		}
	}
}

컴포넌트 내부에서 라우터제어

//main.js에서 router를 주입하였기 때문에
//this.$router.parmas.id
//this.$router.query.plan
//this.$router.push() 와 같이 접근가능.
export default {
  data() {
    return {
      id: this.$route.params.id //단, id값이 변경되면 값이 업데이트 되지 않음.
    };
  },
  watch: {
    $route(to, from) {
      //이를 해결하기 위해 watch를 붙여야 함.
      this.id = to.params.id;
    }
  }
};

Parameter

//params 속성
<router-link
  :to="{name : [name], params : {id : $route.params.id}}"
></router-link>

//query 속성 사용.
<router-link :to="{name : [name], query:{locale : 'ko', q:100}}"></router-link>

Multiple Router Views

현재 페이지가 ‘home’일때 <router-view name="header-top"></router-view> 영역에 ‘Header’컴포넌트가
보여지고, <router-view name="header-bottom"></router-view>는 화면에 노출되지 않음.
반대로, ‘user’에 진입하면 <router-view name="header-top"></router-view>는 화면에 보이지않고
<router-view name="header-bottom"></router-view>가 화면에 보여짐.

<router-view name="header-top"></router-view>
<router-view></router-view>
<router-view name="header-bottom"></router-view>
//router
{path : '/', name : 'home', components : {
	default : Home,
	'header-top' : Header
}},
{path : '/user', components : {
	default : User,
	'header-bottom' : Header
}}

리다이렉트

{path : ‘/redirect-me’, redirect : {name : ‘home’}} {path : ‘*’, redirect : ‘/’}

기타 고급기법

  • 페이지전환 애니메이션
  • hash값(페이지 이동) 무시
  • 페이지전환 높이설정 가능.
  • router.beforeEch((to, from, next)=>{});
  • router.beforeEnter((to, from, next)=>{});
  • router.beforeLeave((to, from, next)=>{});
  • 컴포넌트 안에서 사용 할때
    • beforeRouteEnter(to, from, next){}
    • beforeRouteLeave(to, from, next){}
  • 지연된 로딩 대처 : 코드분할()

댓글남기기