草稿箱自动保存需用pinia-plugin-persistedstate插件精准持久化关键字段(如title、content、tags、draftid),避开ui状态;优先localstorage,配合防抖+beforeunload保存及beforehydrate校验迁移。

草稿箱表单数据自动保存,核心是让用户输入中途不丢失——关掉页面、刷新、甚至意外崩溃后回来还能继续填。Pinia 本身不存数据,得靠 pinia-plugin-persistedstate 插件把状态“落盘”,但直接全量持久化容易出问题,必须针对性设计。
只存关键字段,避开 UI 临时状态
表单 store 里常混着两类东西:真正要保留的草稿内容(如 title、content、tags),和纯前端控制逻辑(如 isSubmitting、showTips、activeTab)。后者不能也不该存,否则可能引发渲染异常或行为错乱。
- 用 paths 明确列出需持久化的顶层字段:
persist: { paths: ['title', 'content', 'tags', 'draftId'] } - 避免写嵌套路径,比如
form.data.title不支持;如果结构深,先在 state 里扁平化,或改用partialize函数做定制序列化 - 不要设
persist: true全量保存,尤其当 state 包含 ref、computed 或函数时,JSON 序列化会失败或丢数据
选对存储介质:localStorage 还是 sessionStorage?
草稿属于“用户主动暂存、跨会话可用”的数据,优先用 localStorage。它能撑过关闭浏览器、重启电脑,适合长期草稿留存。
- 若草稿仅限当前标签页生命周期(比如多步骤向导中间态),才用
storage: sessionStorage - 注意:localStorage 是同源共享的,多个标签页编辑同一草稿时可能互相覆盖,可通过加时间戳或版本号字段规避
- 敏感字段(如含用户私密描述)不建议明文存在 localStorage,生产环境应结合后端临时草稿接口做兜底
配合防抖 + 手动触发,平衡体验与性能
插件默认在每次 state 变更后立即写入 localStorage,高频输入下可能造成卡顿或写入压力。实际中推荐加一层控制:
- 在 actions 中封装一个
saveDraft()方法,内部调用this.$patch更新状态,再由插件自动落盘 - 输入框绑定
@input或v-model时,用防抖(如 1.5s)调用saveDraft,避免每敲一个字都写一次 - 页面卸载前(
beforeunload)再强制触发一次保存,兜住防抖未生效的最后几秒
加载时做轻量校验,防止脏数据干扰
从 localStorage 拿出来的草稿,可能来自旧版本字段结构,或已被用户手动清空过缓存。直接还原容易报错或显示异常。
- 利用插件的
beforeHydrate钩子,在数据还原前检查关键字段是否存在、类型是否合法 - 例如:
if (!storedState?.title || typeof storedState.title !== 'string') return null,返回 null 表示跳过本次水合 - 也可在此处做字段迁移,比如旧版叫
postContent,新版统一为content,就在这里做映射转换










