在前端表单编辑场景中,用户可能会因误操作离开页面导致未保存内容丢失。本文将介绍在 Vue3 项目中,如何为 /spa/spaTmpl/imDeclarationForm
单证配置页面实现离开提示功能,防止数据意外丢失。
需求场景
项目中的单证配置页面(路径:/spa/spaTmpl/imDeclarationForm
)允许用户进行复杂的表单编辑。当用户在该页面进行修改后尝试离开时,系统需要提供确认提示,避免因误操作导致数据丢失。
实现方案
核心思路
- 使用 Vue Router 的导航守卫拦截路由变化
- 通过响应式对象跟踪页面编辑状态
- 结合 Element Plus 的确认对话框实现交互
路由配置分析
项目路由配置文件 src/router/index.js
中相关配置如下:
javascript
{
path: "/spa",
component: Layout,
children: [
{
path: "spaTmpl/imDeclarationForm",
component: () => import("@/views/imDeclarationForm.vue"),
name: "imDeclarationForm",
meta: {
title: "xx",
keepAlive: true
}
}
]
}
具体实现步骤
1. 添加路由守卫逻辑
修改 src/router/index.js
文件:
javascript
import { createRouter, createWebHashHistory } from "vue-router";
import { ElMessageBox } from 'element-plus';
import { ref } from 'vue';
// 编辑状态存储
const editStatusMap = ref({
'/spa/spaTmpl/imDeclarationForm': false
});
const router = createRouter({
history: createWebHashHistory(),
routes: [...], // 原有路由配置
scrollBehavior: () => ({ left: 0, top: 0 })
});
// 添加全局前置守卫
router.beforeEach((to, from, next) => {
const currentPath = '/spa/spaTmpl/imDeclarationForm';
// 当从目标页面离开且有未保存内容时触发提示
if (from.path === currentPath && editStatusMap.value[currentPath]) {
ElMessageBox.confirm(
'您有未保存的修改,确定要离开吗?',
'提示',
{
confirmButtonText: '确定离开',
cancelButtonText: '继续编辑',
type: 'warning'
}
).then(() => {
next(); // 用户确认离开
}).catch(() => {
next(false); // 用户取消离开
});
} else {
next(); // 正常导航
}
});
export function setupRouter(app) {
app.use(router);
}
export { editStatusMap };
export default router;
2. 组件内编辑状态管理
在 @/views/spa/declaration/imDeclarationForm.vue
中:
vue
<template>
<el-form :model="formData">
<!-- 表单字段 -->
</el-form>
</template>
<script setup>
import { ref, watch } from 'vue';
import { editStatusMap } from '@/router';
const formData = ref({
// 表单初始数据
});
// 监听表单数据变化
watch(formData, () => {
editStatusMap.value['/spa/spaTmpl/imDeclarationForm'] = true;
}, { deep: true });
// 保存方法
const handleSave = () => {
// 调用保存API
editStatusMap.value['/spa/spaTmpl/imDeclarationForm'] = false;
};
</script>
实施要点
1. 状态管理优化
对于大型项目,建议:
- 使用 Pinia 替代简单的 ref 对象
- 将编辑状态与具体业务逻辑解耦
- 考虑添加页面唯一标识防止冲突
2. 用户体验优化
- 添加防抖机制避免频繁提示
- 支持快捷键操作(如 Ctrl+S 保存)
- 提供自动保存功能作为补充
总结
通过上述实现,我们为配置页面添加了可靠的离开确认机制。该方案利用 Vue Router 的导航守卫和 Element Plus 的 UI 组件,以最小代码量实现了核心功能。开发者可根据实际需求进一步扩展,如添加自动保存、编辑历史记录等增强功能,提升用户体验。
完整实现代码已通过测试,在 Vue3 + Element Plus 项目中运行稳定,能够有效防止用户因误操作导致的数据丢失问题。