Vue 3 多步骤表单应分层管理状态:用 ref 管理 currentStep,reactive 或多个 ref 管理各步数据,ref 管理每步验证状态;切换步骤时即时缓存至 localStorage,加载时回填;提交前通过 defineExpose 暴露 validateAndCollect 方法,父组件统一调用校验并聚合数据。

Vue 3 中用 ref 处理多步骤表单的缓存与提交,关键在于**分层管理状态**:把“当前步骤”“各步数据”“是否已验证”分开存,再通过统一入口触发保存或提交,而不是让每一步各自为政。
用 ref 分别管理步骤索引与各步数据
不要只用一个 ref({}) 堆所有字段,容易混乱、难调试。推荐结构清晰的拆分:
-
currentStep = ref(0):控制当前显示哪一步,配合v-if或v-show切换视图 -
formState = ref({ userGender: '', userActivityLevel: '', ... }):用 reactive 更合适,但若你倾向全 ref 风格,也可写成多个独立 ref(如userGender = ref('')),只是维护成本略高 -
stepValid = ref({ info: false, lease: false, fee: false }):每个子组件验证完成后,主动更新对应 key 的布尔值,父组件提交前统一检查
缓存逻辑:离开当前步时自动存入 localStorage
用户填完某一步点击“下一步”,不是等最后才存,而是即时缓存,防意外刷新丢失:
从零开始编排 SpringBoot+Vue 全栈项目工作流,适用于新建全栈项目或完整脚手架请求,触发后依次调用 product‑spec‑builder(需求调研)等模块。
- 在切换步骤前调用一个
saveStepData()函数 - 该函数读取当前 step 对应的字段名(比如从配置数组
steps[currentStep.value].field拿到'userGender'),再把formState.value[userGender]写进localStorage - 页面加载时,遍历所有字段名,从
localStorage读取并回填到formState.value,避免空白重来
提交前聚合验证与数据组装
多步骤表单的提交难点不在收集,而在“怎么知道每一步都过审了”。靠父组件统一协调:
- 每个子组件暴露一个方法,比如
validateAndCollect(),内部调用el-form?.validate()或手动校验逻辑,返回{ valid: boolean, data: { ... } } - 父组件用
ref持有所有子组件实例(const stepRefs = ref([])),提交时遍历调用stepRefs.value[i].validateAndCollect() - 任一返回
valid: false,就中断流程、滚动到对应步骤并提示;全部通过,则合并所有data生成最终提交对象
注意 defineExpose 是跨组件通信的前提
如果你用 动态渲染,子组件必须显式暴露方法,否则父组件拿到的是空壳实例:
- 子组件里写
defineExpose({ validateAndCollect }) - 父组件模板中加
ref="stepRefs",且确保每次切换组件时stepRefs.value是最新实例(可用key强制重置) - 别依赖
this.$refs.xxx风格写法,<script setup></script>下必须靠defineExpose开门
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









