Vue嵌套路由实现多步骤表单跳转,核心是子路由分步、provide/inject或Pinia共享状态、编程式导航校验跳转、transition动态动画。

Vue 嵌套路由实现多步骤表单跳转,核心是把每一步作为子路由,用父子关系组织流程,配合编程式导航控制前进/回退,同时保持表单数据不丢失。关键不在“跳”,而在“状态怎么留、路径怎么配、用户怎么导”。
路由结构要分层清晰
多步骤表单本质是同一业务下的连续视图,适合用嵌套路由表达层级关系:
- 父路由对应整个表单容器(如 /apply),负责提供共享布局、顶部进度条、统一提交逻辑
- 每个子路由对应一个步骤(如 /apply/basic、/apply/contact、/apply/confirm)
- 在路由配置中明确 children,并为每个子路由设 name,方便命名跳转
示例配置:
const routes = [
{
path: '/apply',
component: ApplyLayout,
children: [
{ path: '', redirect: 'basic' }, // 默认进入第一步
{ path: 'basic', name: 'ApplyBasic', component: StepBasic },
{ path: 'contact', name: 'ApplyContact', component: StepContact },
{ path: 'confirm', name: 'ApplyConfirm', component: StepConfirm }
]
}
]
表单数据要集中管理
各步骤组件不能各自维护独立 data,否则跳转后状态清空。推荐两种方式:
-
使用组合式 API + provide/inject:在父组件
ApplyLayout中定义 reactive 表单对象,通过provide注入,所有子步骤用inject获取并修改 -
抽离到 Pinia store:创建
useApplyStore,把表单字段、当前步骤、校验状态都放进去,各步骤组件直接读写 store
这样无论用户点击上一步、下一步,还是浏览器后退,数据始终保留在内存中。
将静态 Vue 页面(index.vue)改造为动态页面(Custom.vue);稿源仅限 index.vue、其引用的 CSS 与资源路径,禁止参考仓库内其他文件。Invoke when user wants to transform a static Vue page into a dynamic data-driven page with Element UI components.
跳转逻辑要可控可拦截
不能只靠 ,需结合编程式导航做条件判断:
- 点击“下一步”时,在当前步骤组件中调用
this.$router.push({ name: 'ApplyContact' })(Vue2)或router.push({ name: 'ApplyContact' })(Vue3) - 跳转前检查本步校验结果,失败则
return,不执行跳转 - 监听路由变化(如
beforeRouteUpdate或watch($route)),当用户手动输入 URL 跳转时,也做权限/状态校验 - 对“上一步”按钮,优先用
router.back(),它天然符合浏览器历史栈行为
视觉反馈和过渡要连贯
嵌套路由默认复用 ,但多步骤需要区分进入/退出动画:
- 在父组件中给
包一层 - 根据
$route.name动态计算transitionName,比如从 basic → contact 用slide-right,反之用slide-left - 避免所有步骤共用同一个
key,否则 Vue 会复用组件实例,导致 mounted 不触发——建议加:key="$route.fullPath"
这样用户能直观感知步骤流动方向,体验更接近原生多页应用。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









