题目重述

本文主要讲解 Vue Router 中的带参数的动态路由匹配机制,包括:

  • 动态参数的定义与使用(如 /users/:id

  • 多参数和自定义正则表达式的高级用法

  • 组件如何响应路由参数的变化

  • 404 路由捕获与通配符配置

  • 参数变化监听方式(组合式 API 和选项式 API)

详解

一、动态路由参数的基本语法

在 Vue Router 中,可以通过在路径中使用冒号 : 来定义动态段(参数)

const routes = [
  { path: '/users/:id', component: User },
]

匹配示例:

  • /users/johnny$route.params.id = 'johnny'

  • /users/jolyne$route.params.id = 'jolyne'

✅ 特点:
  • 所有符合该模式的 URL 都会映射到同一个组件。

  • 参数值通过 $route.params 访问。

二、多参数路由匹配

可以在一个路径中定义多个动态参数:

{ path: '/users/:username/posts/:postId', component: PostDetail }
匹配路径 route.params
/users/eduardo/posts/123 { username: 'eduardo', postId: '123' }

注意:每个 :参数名 对应一个字段,并自动填充到 route.params 对象中。

三、对参数变化做出反应

由于从 /users/a /users/b 同一组件复用,组件不会重新创建,因此:

生命周期钩子(如 created、mounted)不会再次触发

✅ 正确做法是监听 $route 变化:

方法一:使用 watch 监听参数变化(组合式 API)
<script setup>
import { watch } from 'vue'
import { useRoute } from 'vue-router'

const route = useRoute()

watch(
  () => route.params.id,
  (newId, oldId) => {
    console.log('用户ID已变更:', newId)
    // 执行数据加载等操作
  }
)
</script>
方法二:使用导航守卫 onBeforeRouteUpdate
<script setup>
import { onBeforeRouteUpdate } from 'vue-router'

onBeforeRouteUpdate(async (to, from) => {
  userData.value = await fetchUser(to.params.id)
})
</script>

💡 优势:可在守卫中异步获取数据或阻止无效跳转。

四、捕获所有路由(404 处理)

为了处理不存在的页面,可以使用通配符路由

1. 捕获任意路径
{
  path: '/:pathMatch(.*)*',
  name: 'NotFound',
  component: NotFound
}
  • (.*)* 表示匹配任意字符(包括多级路径)

  • 匹配结果存于 route.params.pathMatch

示例:

  • /not/exist/path route.params.pathMatch = ['not', 'exist', 'path']

  • 或字符串形式:"not/exist/path"

2. 自定义正则表达式参数
{
  path: '/user-:afterUser(.*)',
  component: UserGeneric
}

匹配:/user-john, /user-admin-settings

五、编程式导航传参(保留结构)

当需要跳转到通配符路由并保持路径结构时:

router.push({
  name: 'NotFound',
  params: { pathMatch: route.path.substring(1).split('/') },
  query: route.query,
  hash: route.hash
})

⚠️ 注意:substring(1) 避免生成 // 开头的 URL

六、服务器配置提示(History 模式)

        若使用 createWebHistory 模式(无 #),必须确保后端服务器将所有前端路由请求指向 index.html,否则刷新会导致 404。

常见配置:

  • Nginx: 添加 try_files $uri $uri/ /index.html;

  • Node.js (Express): 使用中间件 fallback 到 index.html

图表示意:动态路由匹配逻辑流程图

总结要点

功能 实现方式 注意事项
动态参数 /users/:id 参数通过 $route.params.id 获取
多参数 /a/:x/b/:y 自动生成对应字段对象
参数监听 watch(route.params) 或 onBeforeRouteUpdate 生命周期钩子不触发!
通配符路由 /:pathMatch(.*)* 用于 404 页面
编程式导航传参 params: { pathMatch: [...] } 防止双斜杠问题
History 模式 createWebHistory() 需服务器支持

知识点

  • 动态路由参数:通过 :param 定义,匹配后可通过 $route.params 访问,适用于用户详情等场景。

  • 参数变化监听:组件复用时不触发生命周期,需用 watch onBeforeRouteUpdate 响应变化。

  • 通配符与正则匹配:使用 (.*)* 实现全路径捕获,用于 404 页面或灵活路由设计。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐