pinia 跨步骤暂存表单数据的核心是集中托管状态:1. 创建专用 store 分层管理流程、数据、有效性与错误;2. 各步骤直接读写 store,不维护本地状态;3. 用 pinia-plugin-persistedstate 持久化非敏感字段;4. 校验逻辑统一收口于 store 的 actions 中。

在多步骤表单中用 Pinia 跨步骤暂存数据,核心是把整个表单的状态集中托管到一个 Store 里,各步骤组件只读写这个统一的数据源,不依赖 props 传递或本地临时变量。关键不是“存”,而是“结构清晰 + 响应式同步 + 按需校验”。
1. 设计一个专用于表单的 Store
创建如 useFormStore.ts 的仓库,用 defineStore 定义,状态按逻辑分层:
-
基础流程控制:用
ref管理currentStep、totalSteps、isSubmitting -
表单数据主体:用
reactive管理formData(如{ name: '', email: '', address: {} }),保证嵌套属性响应式 -
步骤有效性:用
ref或reactive存stepValid: Record<number boolean></number>,比如{ 1: true, 2: false } -
错误与提示:可加
errors: Record<string string></string>供各步骤校验后写入
2. 各步骤组件只读写 Store,不维护本地状态
每个步骤页面(如 Step1.vue、Step2.vue)直接使用 Store:
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
- 通过
storeToRefs解构formData和currentStep,绑定到表单项:<input v-model="formData.name"> - 切换步骤时调用 Store 的
nextStep()或prevStep()方法,内部自动更新currentStep并可触发校验 - 提交前调用
validateAllSteps()(在 actions 中实现),遍历stepValid判断是否全部为true
3. 支持中途离开再返回,数据不丢失
用户跳转到其他页面再回来,表单数据仍需保留:
- 安装并注册
pinia-plugin-persistedstate,默认持久化整个 Store 到localStorage - 若只想持久化
formData,可在 Store 配置中指定persist: { paths: ['formData'] } - 敏感字段(如密码、token)不要持久化,Store 中设为非持久化字段即可
4. 校验与状态联动要收口在 Store 内
避免各步骤组件各自校验、各自设置错误信息,导致状态分散:
- 在 Store 的
actions中定义validateStep(step: number),根据当前 step 对formData做规则检查 - 校验结果写入
stepValid[step] = true/false,同时更新errors对象 - 上一步/下一步按钮点击时,先调用该方法,失败则阻止跳转并高亮错误项
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









