嵌套路由中子路由未匹配时不会触发顶层通配符,需在父路由children中配置空路径默认路由和:pathMatch(.)子级通配路由,并确保其命名唯一;或通过meta标记+全局守卫统一拦截跳转。

Vue 嵌套路由中,子路由未匹配时不会自动触发顶层的 /:pathMatch(.*)* 通配符路由——因为父路由已成功匹配,子路径为空或非法,但整体 URL 仍落在父路由范围内。此时需在父组件内部显式处理“子路由未命中”的情况。
在父组件的 <router-view> 外层加兜底逻辑
父组件(如 User.vue)应判断当前子路由是否有效,若 $route.matched 中无活跃子路由(即只匹配到父级自身),就主动渲染 404 内容或重定向:
- 用
v-if控制:当$route.matched.length === 1(仅父路由匹配)且当前路径不是父路由默认子路径(如/user/123)时,显示 Not Found 提示 - 更推荐方式:在父组件
setup中监听$route变化,发现子路由未命中时调用router.push({ name: 'user-not-found', params: { id: $route.params.id } }),跳转到一个专用于嵌套场景的 404 子路由
为嵌套路由配置专用的空路径 + 通配子路由
在父路由的 children 数组里,明确声明两个关键子路由:
Vue 3 组合式 API 与 最佳实践,涵盖代码组织、useXxx 模式、组合式函数设计、Store 集成、响应式优化及功能抽取。
-
默认子路由:
{ path: '', component: UserHome },处理/user/123这类无后缀路径 -
子级通配路由:
{ path: ':pathMatch(.*)*', name: 'user-404', component: UserNotFound, meta: { hidden: true } },放在children最末位,专门捕获/user/123/xxx中xxx不合法的情况
注意:这个 :pathMatch(.*)* 必须写在 children 里,且命名要唯一(不能与全局 404 同名),否则会被忽略。
立即学习“前端免费学习笔记(深入)”;
配合路由元信息做统一拦截
给所有需要子路由校验的父路由添加 meta: { requiresChild: true },然后在全局前置守卫中检查:
- 若
to.matched.some(r => r.meta.requiresChild)为真,且to.matched.length === to.matched.findIndex(r => r.children?.length)(即最后匹配的路由是父级、无子级生效),则强制跳转到对应子级 404 路由 - 这样可避免在每个父组件里重复写判断逻辑,适合中后台多层嵌套场景


















