vue-router 重難點總結筆記
1,使用動態路由配置的(如:‘:id’),可以在this.$router.params.id獲得。
官網例子:
模式 | 匹配路徑 | $route.params |
---|---|---|
/user/:username | /user/evan | { username: 'evan' } |
/user/:username/post/:post_id | /user/evan/post/123 | { username: 'evan', post_id: 123 } |
⚠️注意:當使用路由引數時,例如從 /user/foo
/user/bar
,原來的元件例項會被複用。因為兩個路由都渲染同個元件,比起銷燬再建立,複用則顯得更加高效。
不過,這也意味著元件的生命週期鉤子不會再被呼叫。此時可以使用:watch監聽$route物件,或者導航守衛beforeRouterUpdate。
2,$router和$route的區別,前者是全域性路由物件,後者是當前路由。
3,匹配優先順序:誰先定義誰的優先順序高。
4,巢狀路由:要注意,以 /
開頭的巢狀路徑會被當作根路徑。 這讓你充分的使用巢狀元件而無須設定巢狀的路徑。
5,a:程式設計式路由:如果提供了 path
params
會被忽略
b:router.replace(location, onComplete?, onAbort?) 不會向 history 新增新記錄
router.push(location, onComplete?, onAbort?) 會向 history 新增新記錄
onComplete 導航成功完成的回撥
onAbort 導航失敗的回撥
6,命名檢視:同個路由多個檢視:如果 router-view
沒有設定名字,那麼預設為 default
<router-view class="view one"></router-view> <router-view class="view two" name="a"></router-view> <router-view class="view three" name="b"></router-view>
const router = new VueRroutes: [
{ path: '/', components: { default: Foo, a: Bar, b: Baz }
} ] })
7,重定向:注意導航守衛並沒有應用在跳轉路由上,而僅僅應用在其目標上。
8,路由元件傳參:使用$route,會與元件高度耦合,
使用props
將元件和路由解耦。
const User = {
props: ['id'], template: '<div>User {{ id }}</div>' } const router = new VueRouter({ routes: [ { path: '/user/:id', component: User, props: true }, // 對於包含命名檢視的路由,你必須分別為每個命名檢視新增 `props` 選項: { path: '/user/:id', components: { default: User, sidebar: Sidebar }, props: { default: true, sidebar: false } } ] })
9,導航守衛:
next('/')
或者next({ path: '/' })
: 跳轉到一個不同的地址。當前的導航被中斷,然後進行一個新的導航。你可以向next
傳遞任意位置物件,且允許設定諸如replace: true
、name: 'home'
之類的選項以及任何用在router-link
的to
prop 或router.push
中的選項。next(error)
: (2.4.0+) 如果傳入next
的引數是一個Error
例項,則導航會被終止且該錯誤會被傳遞給router.onError()
註冊過的回撥。
10,
router.
beforeEach 當一個導航觸發時,全域性前置守衛按照建立順序呼叫
router.beforeResolve 在導航被確認之前,同時在所有元件內守衛和非同步路由元件被解析之後
路由獨享的守衛:在路由配置上直接定義
11,beforeEnter
守衛:
const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, beforeEnter: (to, from, next) => { // ... } } ] })
12,beforeRouteEnter
守衛 不能 訪問 this,update,leave可以訪問this。僅僅是beforeRouterEnter支援next傳遞迴調。
beforeRouteEnter
守衛 不能 訪問 this
,因為守衛在導航確認前被呼叫,因此即將登場的新元件還沒被建立。不過,你可以通過傳一個回撥給 next
來訪問元件例項。在導航被確認的時候執行回撥,並且把元件例項作為回撥方法的引數。
beforeRouteEnter (to, from, next) { next(vm => { // 通過 `vm` 訪問元件例項 }) }
13,
完整的導航解析流程
- 導航被觸發。
- 在失活的元件裡呼叫離開守衛。
- 呼叫全域性的
beforeEach
守衛。 - 在重用的元件裡呼叫
beforeRouteUpdate
守衛 (2.2+)。 - 在路由配置裡呼叫
beforeEnter
。 - 解析非同步路由元件。
- 在被啟用的元件裡呼叫
beforeRouteEnter
。 - 呼叫全域性的
beforeResolve
守衛 (2.5+)。 - 導航被確認。
- 呼叫全域性的
afterEach
鉤子。 - 觸發 DOM 更新。
- 用建立好的例項呼叫
beforeRouteEnter
守衛中傳給next
的回撥函式。
14,路由元資訊
下面例子展示在全域性導航守衛中檢查元欄位:
router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { // this route requires auth, check if logged in // if not, redirect to login page. if (!auth.loggedIn()) { next({ path: '/login', query: { redirect: to.fullPath } }) } else { next() } } else { next() // 確保一定要呼叫 next() } })