• 开始时间:2020-03-12
  • 目标主要版本:Router 4.x
  • 引用 issue:N/A
  • 实现的 PR:N/A

摘要

创建路由时,你可以使用 meta 属性附加任何数据:

  1. { path: '/profile', meta: { requiresAuth: true }}

然后可以在导航守卫和 $route 上访问它:

  1. router.beforeEach((to, from, next) => {
  2. if (to.meta.requiresAuth && !auth.loggedIn()) next('/login')
  3. else next()
  4. })

然而,在处理嵌套路由时,meta 将只包含匹配的路由 meta。你仍然可以像文档中指出的那样,通过匹配记录的数组找到所有 meta

  1. router.beforeEach((to, from, next) => {
  2. if (to.matched.some(record => record.meta.requiresAuth))
  3. // ...
  4. })

我的建议时合并所有匹配的路由 meta,从父到子,这样我们就可以做 to.meta.requireAuth。我相信这就是 Nuxt 的做法,但我在文档中找不到链接。

基本范例

给定一个嵌套的路由:

  1. {
  2. path: '/parent',
  3. meta: { requiresAuth: true, isChild: false },
  4. children: [
  5. { path: 'child', meta: { isChild: true }}
  6. ]
  7. }

导航到 /parent/child 应该生成具有一下 meta 的路由:

  1. { requiresAuth: true, isChild: true }

动机

大多数时候,合并 meta 属性是我们所需要的。我从来没有见过一个只需要嵌套 meta 属性的情况。

这将移除使用 to.match.some 来检查 meta 字段是否存在的必要。相反,只需要用它来检查被覆盖的 meta 属性。

具体设计

meta 属性只在第一层进行合并,就像 Object.assing 和展开运算符一样:

  1. {
  2. path: '/parent',
  3. meta: { nested: { a: true } },
  4. children: [
  5. { path: 'child', meta: { nested: { b: true }}}
  6. ]
  7. }

/parent/child 时会产生如下 meta 对象:

  1. {
  2. nested: {
  3. b: true
  4. }
  5. }

缺点

  • 在技术上是一个破坏性的变化

备选方案

N/A

采纳策略

N/A

没有解决的问题

N/A