vue-router如何更新路由信息


背景

在 App.vue 文件中通過 addRoutes 動態添加路由。訪問路由 /login,我發現 this.$route 返回的數據中,meta.a 卻是 undefined。

如果一秒后再次訪問 this.$route,meta.a 為 1。這是為何?

create() {
  const routes = [{
    path: "login",
    name: "login",
    component: () => import('./login.vue),
    meta: {
      a: 1
    }
  }]
  router.addRoutes(routes)
  console.log(this.$route) // 位置1
  setTimeout(() => console.log(this.$route), 1000) // 位置2
}

兩次導航(transitionTo)

第一次 transitionTo

vue-router 初始化過程中,執行下面兩個步驟:

步驟A) 根據傳入的路由數組(此時為[])調用 createRouteMap 生成路由圖譜,並主動觸發一次 transitionTo,transitionTo 在路由圖譜中查找是否有 /login

步驟B) 如果沒有,則會生成一條記錄,然后更新路由,顯然,這條新路由的meta一定為空。

第二次 transitionTo

當執行 addRoutes 時,也會執行步驟A),但此時,transitionTo 就可以在路由圖譜中找到 /login 這條數據,它的 meta.a 為 1。但為什么在 位置1 處,訪問 this.$route,meta.a 仍然是 undefined ?

異步or同步

每次 transitionTo 都會生成一組隊列,如下:

var queue = [].concat(
  // in-component leave guards
  extractLeaveGuards(deactivated),
  // global before hooks
  this.router.beforeHooks,
  // in-component update hooks
  extractUpdateHooks(updated),
  // in-config enter guards
  activated.map(function (m) { return m.beforeEnter; }),
  // async components
  resolveAsyncComponents(activated)
);

然后調用 runQueue 按順序執行這組隊列,當隊列執行完畢后,才會更新當前路由信息current

而是否同步更新路由,取決於路由對應的組件是否同步,即根據 resolveAsyncComponents 的解析結果判斷。

在本例中,我們使用component: () => import('./login.vue),解析后發現它是一個異步組件,所以,路由信息更新也是異步的。

如果把例子中的login組件改為同步引用,像這樣:

import login from './login'
...
component: login
...

那么無論在 位置1 還是 位置2,都能得到同樣的路由信息。

p.s. 訪問 this.$route,就是獲取當前路由信息current的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM