快速入門
- 安裝路由
npm install --save vue-router
- 定義組件
<template>
<div>
<h3>Home</h3>
<router-link to="/login">Login</router-link>
</div>
</template>
<script>
export default {};
</script>
- 定義路由規(guī)則
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
export default new VueRouter({
mode: 'history',
routes: [
{ path: '/', component: () => import('../views/home.vue') },
{ path: '/login', component: () => import('../views/login.vue') },
]
});
- 在需要顯示路由位置放<router-view />
<router-view />
這就完成一個簡單路由
深入路由
基礎
VueRouter.model :
- hash(默認):使用 URL 的 hash 來模擬一個完整的 URL
- history :利用 history.pushState API 來完成 URL 跳轉而無須重新加載頁面
<router-link> : 路由功能導航塑径,默認生成<a>標簽些己,可以使用tag屬性修改生成的標簽
<router-view /> - 路由出口阴挣,匹配到的路由會在這里渲染
動態(tài)路由
通常鏈接需要帶上參數,根據參數顯示不同結果
Vue動態(tài)路由用":" 匹配路徑參數幔烛,然后就匹配的參數放入$route.params
- 定義動態(tài)路由,這里需要對路由命名,獲取名稱和性別
{ path: '/login/:username/:sex', name: 'login', component: () => import('../views/login.vue') },
- 路由鏈接 - 需要路由命名
<router-link :to="{ name: 'login', params: { username, sex } }">Login</router-link>
<!--等價于-->
<router-link to="/login/WilsonPan/1">Login</router-link>
- 組件獲取路由參數
<h3>username : {{ this.$route.params.username }}</h3>
<h3>sex : {{ this.$route.params.sex === 1 ? "男" : "女" }}</h3>
注:除了可以設置路由參數鉴吹,還可以設置query參數
<router-link :to="{ name: 'login', query: { id: 3 }, params: { username, sex } }">Login</router-link>
<!--等價于-->
<router-link to="/login/WilsonPan/1?id=3">Login</router-link>
組件獲取query參數
<h3>id : {{ this.$route.query.id }}</h3>
嵌套路由
一個路由渲染的頁面包含另外的路由
- 定義路由
{
path: '/',
name: 'home',
component: () => import('../views/home.vue'),
children: [
{ path: '/', component: () => import('../components/ComponentDemo.vue') },
{ path: '/directives', component: () => import('../components/Directives.vue') }
]
}
- 在需要顯示子路由的地方放子路由渲染頁面
<router-view />
導航守衛(wèi)
導航守衛(wèi)主要用來通過跳轉或取消的方式守衛(wèi)導航良风,導航守衛(wèi)有全局的谊迄,單個路由的,組件級別烟央,用于未登錄控制訪問统诺,控制訪問等。
全局路由
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
// ...
})
- to: Route: 即將要進入的目標路由對象
- from: Route: 當前導航正要離開的路由
- next: Function: 一定要調用該方法來 resolve 這個鉤子疑俭。執(zhí)行效果依賴 next 方法的調用參數粮呢。
路由獨享的守衛(wèi)
const router = new VueRouter({
routes: [
{
path: '/foo',
component: Foo,
beforeEnter: (to, from, next) => {
// ...
}
}
]
})
組件內的守衛(wèi)
const Foo = {
template: `...`,
beforeRouteEnter (to, from, next) {
// 在渲染該組件的對應路由被 confirm 前調用
// 不!能钞艇!獲取組件實例 `this`
// 因為當守衛(wèi)執(zhí)行前啄寡,組件實例還沒被創(chuàng)建
},
beforeRouteUpdate (to, from, next) {
// 在當前路由改變,但是該組件被復用時調用
// 舉例來說哩照,對于一個帶有動態(tài)參數的路徑 /foo/:id挺物,在 /foo/1 和 /foo/2 之間跳轉的時候,
// 由于會渲染同樣的 Foo 組件飘弧,因此組件實例會被復用识藤。而這個鉤子就會在這個情況下被調用。
// 可以訪問組件實例 `this`
},
beforeRouteLeave (to, from, next) {
// 導航離開該組件的對應路由時調用
// 可以訪問組件實例 `this`
}
}