vue에서 페이지 이동을 위한 라이브러리인 vue router에 대해 정리하고자 한다.
npm install vue-router --save
├── router
│ └── index.js
├── App.vue
└── main.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import Info from '../views/Info.vue';
Vue.use(VueRouter);
export default new VueRouter({
mode:'history', //해쉬값 제거 방식
routes: [{
path: '/',
redirect: '/home'
}, {
path: '/home',
component: () => import('../views/Main.vue'),
}, {
path: '/info',
component: Info
}]
});
<template>
<div id="app">
<router-link to="/main">main</router-link>
<router-link to="/info">info</router-link>
<!-- convert -->
<!-- <a href="#/main" class="">main</a> -->
<router-view></router-view>
</div>
</template>
import Vue from 'vue';
import App from './App.vue';
import router from './router/index.js';
new Vue({
router,
render: h => h(App),
}).$mount('#app')
<router-link to="경로"> 태그
router-link-exact-active
등 class를 통해 스타일을 줄 수 있음<router-view>
// router.js
// 만약, url이 '/post/123'라면 :[id]=123 데이터와 함께 PostItem 컴포넌트로 이동
const router = new VueRouter({
routes: [{
path : '/post/:id'
component : () => import('../views/PostItem.vue')
}]
});
// PostItem.vue
// this.$route.params.id로 값을 전달 받을 수 있음
created() {
getPost('requestPost', this.$route.params.id);
}
<div id="app">
// url="/user/.."인 경우 User 컴포넌트가 들어옴
<router-view></router-view>
</div>
const User = {
template: `
<div class="user">
<h2>User {{ $route.params.id }}</h2>
// id값에 맞는 User의 하위 컴포넌트가 들어옴
<router-view></router-view>
</div>
`,
}
const routes = [
{
path: '/user/:id',
component: User,
children: [
{
// /user/:id/profile is matched
path: 'profile',
component: UserProfile,
},
{
// /user/:id/posts is matched
path: 'posts',
component: UserPosts,
},
],
},
]
// App.vue
<div id="app">
<router-view name="appHeader"></router-view>
<router-view></router-view>
<router-view name="appFooter"></router-view>
</div>
// router.js
{
path: '/home',
// Named Router
components: {
appHeader: AppHeader,
default: Body,
appFooter: AppFooter
}
},
Nested Router vs Named Views
- Nested Router: 특정 URL에 지정된 1개의 컴포넌트가 여러 개의 하위 컴포넌트를 갖는 것
- Named View: 특정 URL에 여러 개의 컴포넌트를 영역 별로 지정하여 렌더링 하는 것
<router-link :to="{ name: 'user', params: { username: 'erina' }}">
User
</router-link>
const routes = [
{
path: '/user/:username',
name: 'user',
component: User
}
]
<template>
<transition name="fade">
<router-view class="main"></router-view>
</transition>
</template>
<style scoped>
/* CSS : Router Transition */
.fade-enter-active, .fade-leave-active {
transition: opacity .5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
</style>
// '/a'에서 '/b'로 리디렉션
routes: [{path : '/a', redirect: '/b'}]
// 이름이 있는 라우터의 경우
routes: [{path : '/a', redirect: {name: 'babo'}}]
// 함수를 사용하여 동적 리디렉션 가능
routes: [{path : '/a', redirect: to => {return '/with-params:id'}}]
routes: [
{ path: '/a', component: A, alias: '/b' }]
// $route에 의존성이 걸려있는경우
template: '<div>User {{ $route.params.id }}</div>'
// 의존성 해제
// 1. Boolean mode (props: true / false)
const User = {
props: ['id'],
template: '<div>User {{ id }}</div>'
}
{ path: '/user/:id', component: User, props: true }
// 2. Object mode
{ path: '/promotion/from-newsletter', component: Promotion, props: { newsletterPopup: false } }
// 3. Function mode
// props를 반환하는 함수도 만들 수 있습니다.
{ path: '/search', component: SearchUser, props: (route) => ({ query: route.query.q }) }
// named view + Boolean mode
{ path: '/user/:id', components: { default: User, sidebar: Sidebar }, props: { default: true, sidebar: false } }
참고
https://router.vuejs.org
https://2dongdong.tistory.com/41
https://soheemon.tistory.com/entry/2021-03-15-vue-Router
감사합니다 작은 기본 지식 얻고갑니다.