学习笔记:Vue Router 动态路由与参数匹配详解

题目重述

本文主要讲解 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 页面或灵活路由设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小风华~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值