当前位置:  首页>> 技术小册>> TypeScript和Vue从入门到精通(五)

15.2.2 路由匹配的语法规则

在Vue.js项目中,尤其是在结合Vue Router构建单页面应用(SPA)时,路由匹配是核心功能之一,它决定了URL如何映射到不同的组件上。TypeScript作为JavaScript的超集,为Vue项目提供了类型安全性和更强大的开发体验。在本节中,我们将深入探讨Vue Router中路由匹配的语法规则,结合TypeScript的使用,帮助读者从入门到精通这一关键领域。

1. 基本路由匹配

Vue Router通过路由表(routes array)来定义路由的映射关系。每个路由记录都是一个包含pathcomponent(或components对于命名视图)的对象。基本的路由匹配是通过path字段实现的,它指定了URL的路径模板。

  1. import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
  2. const routes: Array<RouteRecordRaw> = [
  3. {
  4. path: '/',
  5. name: 'Home',
  6. component: () => import('@/views/Home.vue')
  7. },
  8. {
  9. path: '/about',
  10. name: 'About',
  11. // 假设About.vue是一个使用TypeScript的Vue组件
  12. component: () => import('@/views/About.vue')
  13. }
  14. ];
  15. const router = createRouter({
  16. history: createWebHistory(),
  17. routes
  18. });

在上面的例子中,当访问/路径时,将渲染Home.vue组件;访问/about时,则渲染About.vue组件。

2. 动态路由匹配

当需要根据URL的不同部分来动态渲染组件时,可以使用动态路由匹配。动态段被[ ]标记,并在组件内部通过$route.params来访问。

  1. const routes: Array<RouteRecordRaw> = [
  2. {
  3. path: '/user/:id',
  4. name: 'UserProfile',
  5. component: () => import('@/views/UserProfile.vue')
  6. }
  7. ];

UserProfile.vue组件中,可以通过this.$route.params.id来访问动态段id的值。注意,在使用history模式时,需要确保服务器配置正确,以便对非实际文件路径的请求也能返回同一个index.html页面。

3. 星号路由(通配符路由)

星号路由(也称为通配符路由)用于匹配所有未被前面路由规则捕获的路径。这通常用于404页面或应用中的默认页面。

  1. const routes: Array<RouteRecordRaw> = [
  2. // 其他路由...
  3. {
  4. path: '*',
  5. name: 'NotFound',
  6. component: () => import('@/views/NotFound.vue')
  7. }
  8. ];

这样配置后,任何未匹配到其他路由的URL都将被重定向到NotFound.vue组件。

4. 嵌套路由

嵌套路由允许我们在Vue组件内部定义子路由,实现组件的嵌套展示。这通常用于构建具有多个视图区域的复杂页面布局。

  1. const routes: Array<RouteRecordRaw> = [
  2. {
  3. path: '/user/:id',
  4. component: () => import('@/views/UserLayout.vue'),
  5. children: [
  6. {
  7. path: 'profile', // 注意,这里不需要`/`开头
  8. component: () => import('@/views/UserProfile.vue')
  9. },
  10. {
  11. path: 'posts',
  12. component: () => import('@/views/UserPosts.vue')
  13. }
  14. ]
  15. }
  16. ];

UserLayout.vue组件中,你可以使用<router-view>来展示匹配的子路由组件。当访问/user/123/profile时,UserProfile.vue将被渲染到UserLayout.vue中的<router-view>位置。

5. 路由别名

路由别名允许你定义一个路径的别名,用户可以通过不同的URL访问同一个路由。

  1. const routes: Array<RouteRecordRaw> = [
  2. {
  3. path: '/foo',
  4. component: () => import('@/views/Foo.vue'),
  5. alias: '/foobar' // 为/foo设置别名/foobar
  6. }
  7. ];

现在,访问/foo/foobar都会渲染Foo.vue组件。

6. 路由重定向

路由重定向允许你定义一个路由,当访问该路由时,自动重定向到另一个路由。

  1. const routes: Array<RouteRecordRaw> = [
  2. {
  3. path: '/old-path',
  4. redirect: '/new-path' // 重定向到/new-path
  5. },
  6. {
  7. path: '/new-path',
  8. component: () => import('@/views/NewPath.vue')
  9. }
  10. ];

7. 路由守卫

虽然路由守卫不直接涉及路由匹配的语法规则,但它们是Vue Router中不可或缺的一部分,用于在路由进入、离开前后执行特定逻辑,如权限验证、页面标题设置等。

  • 全局守卫:如beforeEachafterEach,在整个路由实例上定义。
  • 路由独享守卫:在单个路由记录上定义,如beforeEnter
  • 组件内守卫:在组件内部定义,如beforeRouteEnterbeforeRouteUpdate(2.2+)、beforeRouteLeave
  1. router.beforeEach((to, from, next) => {
  2. // 假设我们在这里做权限检查
  3. if (to.matched.some(record => record.meta.requiresAuth)) {
  4. // 这里可以检查用户是否已登录
  5. if (!isLoggedIn()) {
  6. next({
  7. path: '/login',
  8. query: { redirect: to.fullPath } // 登录后重定向到原路径
  9. });
  10. } else {
  11. next(); // 确保一定要调用 next()
  12. }
  13. } else {
  14. next(); // 确保一定要调用 next()
  15. }
  16. });

8. 路由元信息

在路由定义中,可以添加一个meta字段,用于存储自定义信息。这些信息可以在路由守卫、导航钩子中被访问,实现如页面标题设置、权限控制等逻辑。

  1. const routes: Array<RouteRecordRaw> = [
  2. {
  3. path: '/secret',
  4. component: () => import('@/views/Secret.vue'),
  5. meta: { requiresAuth: true }
  6. }
  7. ];

然后,在全局守卫中检查meta字段来执行相应的逻辑。

结语

路由匹配的语法规则是Vue Router中构建单页面应用的基础。通过掌握这些规则,你可以灵活地定义路由映射,构建出结构清晰、功能丰富的Vue应用。结合TypeScript的使用,你还可以享受到类型安全的优势,减少因类型错误导致的bug,提升开发效率。希望本章内容能帮助你更好地理解和运用Vue Router的路由匹配功能。


该分类下的相关小册推荐: