我有一个组件通过输入(文本字段、自定义选择等)处理一些用户数据firstName
,例如lastName
有一个 vuex 存储存储这些数据,并且组件字段与之绑定v-model
。
我希望这些字段是可编辑的,但是当用户开始编辑其中一个字段时,按钮Save
应该Cancel
会出现。
单击Save
按钮应用更改,单击Cancel
应将所有字段恢复到开始编辑之前的状态。
我想知道这项任务是否有任何最佳实践/模式?
我有一个组件通过输入(文本字段、自定义选择等)处理一些用户数据firstName
,例如lastName
有一个 vuex 存储存储这些数据,并且组件字段与之绑定v-model
。
我希望这些字段是可编辑的,但是当用户开始编辑其中一个字段时,按钮Save
应该Cancel
会出现。
单击Save
按钮应用更改,单击Cancel
应将所有字段恢复到开始编辑之前的状态。
我想知道这项任务是否有任何最佳实践/模式?
我不知道这是否是最佳做法,但我可以解释一下我是如何处理类似事情的。我有 2 个属性,formFieldsModified
并且formFieldsInitialState
.
data() {
return {
formFieldsModified: false,
formFieldsInitialState: {}
}
}
当组件被安装/创建时,我调用一个名为setFormFieldsInitialState
.
created: function () {
this.$store.dispatch('LOAD_USER').then((item) => {
this.setFormFieldsInitialState()
});
}
这是使用 lodash 创建对象的深层克隆,因此我可以与当前user
对象进行比较,看看是否有任何变化。
setFormFieldsInitialState() {
this.formFieldsInitialState = _.cloneDeep(this.user)
this.formFieldsModified = false;
}
然后你可以观察模型的变化,假设它被称为user
.
watch: {
'user': {
handler: function (val) {
this.formFieldsModified = (!_.isEqual(val, this.formFieldsInitialState)) ? true : false;
},
deep: true
}
}
现在,您可以this.formFieldsModified
根据是否修改了任何表单字段来切换按钮的可见性。
至于取消/保存操作 - 您将必须有一个不同的方法来实际更新您的商店,因此除非用户单击保存按钮并调度更新商店的操作,否则不会发生任何事情。然后,您可以使用formFieldsInitialState
创建的对象将任何值恢复为原来的值。