beforeRouteLeave 实现未保存草稿提示:在 Options API 组件中定义守卫,配合 isDirty 标志与表单快照比对,在路由离开前弹窗确认;提交后重置状态,并用 beforeunload 兜底页面关闭场景。

Options API 中使用 beforeRouteLeave 实现路由切换前的未保存草稿提示,关键在于:在组件选项中定义守卫函数,配合响应式数据标记“脏状态”,再用原生 confirm 或 UI 框架弹窗拦截导航。它不依赖 setup,也不需要额外 hook,写法直接、兼容性好。
1. 初始化表单快照并监听是否改动
在 data 中声明初始值和脏状态标志,在 mounted 或 created 里保存快照:
- 用
JSON.stringify(this.form)或structuredClone(this.form)存初始值(避免引用污染) - 定义
isDirty: false,并在表单输入事件(如@input、@change)中更新它 - 更稳妥的做法是用
watch深监听整个 form 对象,自动比对快照(需注意数组/对象深层变化)
2. 在组件选项中定义 beforeRouteLeave
直接写在组件 options 的同级位置,接收 (to, from, next) 参数:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 检查
this.isDirty,为true时调用弹窗(如this.$confirm或window.confirm) - 用户点“确定”就执行
next();点“取消”必须明确调用next(false)阻止跳转 - 不要在异步回调外直接调用
next(),否则可能被浏览器忽略或触发多次
3. 提交成功后及时重置状态
表单提交完成(无论成功或失败),要同步做两件事:
- 把当前 form 赋值给初始快照变量(如
this.initialForm = JSON.parse(JSON.stringify(this.form))) - 设
this.isDirty = false,避免后续跳转重复提示 - 如果用了 localStorage 自动暂存,此时也应清除对应草稿项
4. 补充 beforeunload 兜底关闭/刷新场景
beforeRouteLeave 只管路由跳转,不覆盖页面关闭或刷新。需手动绑定 beforeunload:
- 在
mounted中,当isDirty为真时,window.addEventListener('beforeunload', handler) - handler 返回字符串(如
"您有未保存的更改"),触发浏览器原生提示 - 在
beforeUnmount或beforeRouteLeave中移除监听,防止内存泄漏


















