需求
- 在提交表单使用http的put请求进行数据更新时,只提交表单中被修改的数据,而不是提交整个表单
解决
-
获取表单数据时clone一份作为原始数据
rawData
-
在提交表单前将表单数据
formData
和rawData
的数据进行比较 -
将差异存放到新的对象
diffData
中,在提交表单时提交就行了
实现(部分代码)
- template中的代码
<template>
<el-form ref="formRef" :model="form">
<el-form-item label="用户名">
<el-input v-model="form.username"></el-input>
</el-form-item>
<el-form-item label="地址">
<el-input v-model="form.address"></el-input>
</el-form-item>
<el-form-item label="手机号码">
<el-input v-model="form.phone"></el-input>
</el-form-item>
<el-form-item>
<el-button @click="updateInfo">保存修改</el-button>
</el-form-item>
</el-form>
</template>
- script中的代码
<script>
export default {
data () {
return {
form: {}, // 表单数据
rawData: '', // 获取表单时clone的原始数据
diffData: '' // 差异
}
},
created () {
this.getFormData()
},
methods: {
// 获取数据的方法
async getFormData () {
const { data: res } = await this.$http.get('user')
..........
this.form = res.data // 表单数据
this.rawData = { ...res.data } // 原始数据
},
// 比较差异的方法
diffFormData () {
for (let k in this.rawData) {
if (this.rawData[k] !== this.form[k]) {
if (!this.diffData) {
this.diffData = {}
}
this.diffData[k] = this.form[k]
}
}
},
// 提交更新数据的方法
updateInfo () {
//先比对差异赋值给diffData,如果diffData为空则不用提交,不为空则进行提交
this.diffFormData()
if (!this.diffData) {
this.$message.error('未修改任何数据,无需提交')
} else {
this.$refs.formRef.validate(async valid => {
if (!valid) return
const { data: res } = await this.$http.put('user', this.diffData)
........
})
}
}
}
}
</script>
差不多这样子就实现啦
成长路上对自己所学的一些总结,各路大侠若有更好的办法望留言相助哇!
如果这篇文章对你有帮助的话请点帮我点个赞,让我知道我写的文章有帮助到他人哈哈哈,谢谢!