vue-router - 路由匹配语法

634 阅读3分钟

在Vue中路由可以分为像/about 这样的静态路由和 /users/:userId 这样的动态路由

动态路径参数正则

在某些情况下,我们可能需要根据参数的内容来区分两个路由

{ path: '/:orderId' }
{ path: '/:productName' }

这两个路由都可以匹配类似于 /123 的 URL,这可能会导致我们的应用程序出现问题

// 一种解决方法是在路径中添加一个静态部分来区分它们
{ path: '/o/:orderId' }
{ path: '/p/:productName' }

但有时我们可能不想添加静态部分。在这种情况下,我们可以使用自定义正则表达式来指定参数的格式

{ path: '/:orderId(\\d+)' }
{ path: '/:productName' }

上述定义中,我们在 :orderId 参数后面使用了一个括号,括号内包含一个自定义的正则表达式 \d+,该正则表达式匹配一个或多个数字,这意味着如果 URL 中的参数符合数字的格式,它将匹配第一个路由。否则,它将匹配第二个路由

需要注意的是,动态路径参数中的正则会以字符串形式传递给RegExp类,所以我们需要对反斜杠字符进行转义,例如使用 \\d+ 来匹配数字

可重复的参数

如果你需要匹配具有多个部分的路由,如 /first/second/third,你应该用 *(0 个或多个)和 +(1 个或多个)将参数标记为可重复

const routes = [
  // /:chapters ->  匹配 /one, /one/two, /one/two/three, 等
  { path: '/:chapters+' },
  // /:chapters -> 匹配 /, /one, /one/two, /one/two/three, 等
  { path: '/:chapters*' },
]

这些也可以通过在右括号后添加它们与自定义正则结合使用

const routes = [
  // 仅匹配数字
  // 匹配 /1, /1/2, 等
  { path: '/:chapters(\\d+)+' },
  // 匹配 /, /1, /1/2, 等
  { path: '/:chapters(\\d+)*' },
]

sensitive 与 strict

默认情况下,所有路由是不区分大小写的,并且能匹配带有或不带有尾部斜线的路由。例如,路由 /users 将匹配 /users/users/、甚至 /Users/

这种行为可以通过 strictsensitive 选项来修改,它们可以既可以应用在整个全局路由上,又可以应用于当前路由上

sensitive 属性用于指定路由匹配时是否区分大小写,即当该属性为 true 时,路由匹配将区分大小写;当该属性为 false 时,路由匹配将不区分大小写。默认情况下,该属性的值为 false,即路由匹配不区分大小写

strict 属性用于指定路由匹配时是否进行严格匹配,即当该属性为 true 时,路由匹配将进行严格匹配;当该属性为 false 时,路由匹配将进行非严格匹配。默认情况下,该属性的值为 false,即路由匹配进行非严格匹配。

const router = createRouter({
  history: createWebHistory(),
  routes: [
    // 将匹配 /users/posva
    // - 不匹配/users/posva/ 因为strict: true
    // - 不匹配/Users/posva  因为sensitive: true
    { path: '/users/:id', sensitive: true },
    // 将匹配 /users, /Users, 以及 /users/42 不匹配 /users/ 或 /users/42/
    { path: '/users/:id?' },
  ],
  strict: true, // 应用于所有的路由对象
})

可选参数

你也可以通过使用 ? 修饰符(0 个或 1 个)将一个参数标记为可选

请注意,* 在技术上也标志着一个参数是可选的,但 ? 参数不能重复

const routes = [
  // 匹配 /users 和 /users/posva
  { path: '/users/:userId?' },
  // 匹配 /users 和 /users/42
  { path: '/users/:userId(\\d+)?' },
]