Vue Academy · 课时

路由元字段与类型声明

meta: { requiresAuth: true },以及使用 TypeScript 声明合并为元字段添加类型

第 1 / 4 课13 个步骤

路由元字段与类型声明 是 CoddyKit 上的免费 Vue Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Vue Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Vue Academy 课程共包含 4 节课。

什么是路由元字段

每个路由都可以携带一个 元数据对象:附加到路由上的任意数据。它非常适合存放身份验证要求、允许的角色、页面标题或布局选择等标志。

向路由添加元数据

在路由记录上设置 meta 键。值的具体内容完全由您决定。

const routes = [
  {
    path: '/dashboard',
    component: Dashboard,
    meta: { requiresAuth: true, roles: ['admin', 'editor'] }
  }
]

在守卫中读取元数据

最常见的用途是在导航守卫中使用。router.beforeEach 会在每次导航前运行,并接收目标路由;您可以检查该路由的 meta。

router.beforeEach((to, from) => {
  if (to.meta.requiresAuth) {
    // check login
  }
})

重定向未通过身份验证的用户

从守卫中返回一个路由位置即可执行重定向。返回 false 会取消导航;不返回任何内容或返回 true 则允许导航。

router.beforeEach((to) => {
  const auth = useAuthStore()
  if (to.meta.requiresAuth && !auth.isLoggedIn) {
    return { path: '/login' }
  }
})

基于角色的访问控制

将 roles 元字段与当前用户角色结合起来,即可根据权限限制页面访问。

router.beforeEach((to) => {
  const auth = useAuthStore()
  const roles = to.meta.roles
  if (roles && !roles.includes(auth.role)) {
    return { path: '/forbidden' }
  }
})

元数据会从父级合并

嵌套路由会通过 to.meta 继承父级元数据,该对象会合并所有匹配的记录。除非子级覆盖相同的键,否则子级可以看到父级元数据。

类型问题

默认情况下,TypeScript 会将 meta 类型定义为空对象,因此 to.meta.requiresAuth 会报错。您可以针对 Vue Router 类型使用声明合并来解决此问题。

声明类型化元数据

扩展 vue-router 中的 RouteMeta 接口。请将其放在 .d.ts 文件中,或放在包含 export {} 的任何模块中。

import 'vue-router'

declare module 'vue-router' {
  interface RouteMeta {
    requiresAuth?: boolean
    roles?: string[]
  }
}

export {}

现在元数据会进行类型检查

扩展类型后,编译器就能了解 meta 的结构。像 requireAuth 这样的拼写错误会被捕获,同时还可以使用自动补全。

router.beforeEach((to) => {
  if (to.meta.requiresAuth) { /* typed as boolean | undefined */ }
})

在组件中使用元数据

在组件内部,您可以通过 useRoute() 读取当前路由元数据;这同样得益于类型扩展。

import { useRoute } from 'vue-router'
const route = useRoute()
const secure = route.meta.requiresAuth

使用元数据设置页面标题

一种常见模式是:在元数据中存储一个 title,然后从全局守卫中设置 document.title。

router.afterEach((to) => {
  if (to.meta.title) document.title = to.meta.title
})

快速检查

请测试您对路由元数据和类型的了解。

回顾

路由元字段携带每个路由专属的数据:

  • 在路由记录上定义元数据(requiresAuth、roles、标题)。
  • 在 router.beforeEach 中读取元数据,以守护导航。
  • 元数据会从父路由合并到子路由。
  • 通过对来自 vue-router 的 RouteMeta 使用声明合并来定义其类型。
免费开始

用 AI 导师学习 HTML — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
42
课程
156

常见问题解答

「路由元字段与类型声明」课时是免费的吗?

是的 — 「路由元字段与类型声明」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Vue Academy 课程的其余内容,请升级到 CoddyKit PRO。 Vue Academy 课程共包含 4 节课。

「路由元字段与类型声明」这节课中我会学到什么?

meta: { requiresAuth: true },以及使用 TypeScript 声明合并为元字段添加类型 你通过在浏览器中直接运行的动手代码来练习 Vue Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Vue Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Vue Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「路由元字段与类型声明」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Vue Academy 课中编写并运行代码吗?

能。每节 Vue Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 路由元字段与类型声明
  2. 路由过渡与动画
  3. 滚动行为配置
  4. 编程式导航与 useRouter
← 返回 Vue Academy