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的值。

posted @ 2021-03-26 17:55  Liaofy  阅读(2667)  评论(0编辑  收藏  举报