1. 程式人生 > >vue-router 重難點總結筆記

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 VueR
  routes: [
    {    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: truename: '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, 完整的導航解析流程

  1. 導航被觸發。
  2. 在失活的元件裡呼叫離開守衛。
  3. 呼叫全域性的 beforeEach 守衛。
  4. 在重用的元件裡呼叫 beforeRouteUpdate 守衛 (2.2+)。
  5. 在路由配置裡呼叫 beforeEnter
  6. 解析非同步路由元件。
  7. 在被啟用的元件裡呼叫 beforeRouteEnter
  8. 呼叫全域性的 beforeResolve 守衛 (2.5+)。
  9. 導航被確認。
  10. 呼叫全域性的 afterEach 鉤子。
  11. 觸發 DOM 更新。
  12. 用建立好的例項呼叫 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() } })