vue很复杂的表单,有很多数据还有子组件,怎么检查有没有未保存的数据,代码示例
时间: 2023-12-08 21:06:56 浏览: 64
请问您是希望使用 Vue 来实现对表单数据的检查并防止未保存数据的丢失吗?
如果是的话,Vue 提供了许多有用的组件和方法来应对这种需求。下面是一些代码示例,供您参考:
1. 使用 watch 监听数据的变化,在数据变化时触发保存数据的逻辑:
```javascript
<template>
<div>
<input v-model="formData.name"/>
<input v-model="formData.age"/>
<button @click="save">保存</button>
</div>
</template>
<script>
export default {
data() {
return {
formData: {
name: '',
age: ''
},
savedData: {} // 保存已经保存的数据
}
},
watch: {
formData: {
handler: function (newValue, oldValue) {
let isEqual = JSON.stringify(newValue) === JSON.stringify(oldValue)
if (!isEqual) {
// 数据发生了变化,保存数据
this.saveData(newValue)
}
},
deep: true // 监听子对象的变化
}
},
methods: {
saveData(formData) {
// 保存数据的逻辑
this.savedData = {...formData}
},
save() {
// 手动保存数据
this.saveData(this.formData)
}
}
}
</script>
```
2. 使用 Vue-router 来管理页面的跳转,并使用 beforeRouteLeave 钩子函数来判断是否有未保存的数据:
```javascript
<template>
<div>
<input v-model="formData.name"/>
<input v-model="formData.age"/>
<button @click="save">保存</button>
</div>
</template>
<script>
export default {
data() {
return {
formData: {
name: '',
age: ''
},
savedData: {} // 保存已经保存的数据
}
},
methods: {
save() {
// 保存数据的逻辑
this.savedData = {...this.formData}
this.$router.push('/')
}
},
beforeRouteLeave(to, from, next) {
let isEqual = JSON.stringify(this.formData) === JSON.stringify(this.savedData)
if (!isEqual) {
let result = window.confirm('您有未保存的数据,确定要离开吗?')
if (result) {
next()
} else {
next(false)
}
} else {
next()
}
}
}
</script>
```
这些代码示例只是给您一个大致的思路,根据您的具体业务需求和页面实现来具体实现。
阅读全文