Vue 3 Modal 在重新打开时返回旧数据
Vue 3 Modal Comes Back With Old Data When Reopen
我正在使用 Vue 3 和 Vuex 4。当我打开模式时,主要对象(汽车)变得等于默认对象,并且这些默认值填充模式的表单。下面的代码是简化版。
Vuex 模块:
state: {
car: {}
defaults: {
brand: "",
color: "",
value: ""
...
}
},
actions: {
fillTheCar(state, commit) {
commit("SET_CAR", state.defaults)
},
},
mutations: {
SET_CAR(state, payload) {
state.car = payload
}
}
getters: {
data(state) {
return state.car
}
}
当我填写任何输入字段时,“汽车”对象会按预期更新。当我关闭模式时:
methods: {
closeModal() {
this.$store.commit("Cars/SET_CAR", {})
// I have a different Vuex module to control all toggled items
// such as sidebar, modals, header, etc.
// I change modal visibility on there.
this.$store.commit("Toggles/SET_VISIBILITY", {modal: false}
}
}
我的文件结构是这样的:
App.vue
/ Components
/ Modal.vue
/ Input.vue
/ ...
/ Pages
/ Cars
/ Show.vue
/ Edit.vue
/ Create.vue
/ Delete.vue
/ CarModal.vue
当我去“/cars”路线时,Show.vue显示在App.vue。
当我单击“创建”按钮时,Create.vue 会显示出来,其中包括 CarModal.vue 以及与创建汽车相关的所有功能。
CarModal.vue 具有 CRUD 操作所需的所有表单项,并将其自身注入 /components/Modal.vue
//components/Modal.vue
<template>
<teleport to="body">
<slot name="header"></slot>
<slot name="content"></slot>
<slot name="actions"></slot>
</teleport>
</template>
我希望这些详细信息足以获得帮助。这是我的问题:
如果我填写一些输入并关闭模态,然后重新打开它,它会返回之前填充的输入中的数据,即使我在关闭模态时清空了汽车对象。我尝试使用 v-if 销毁 Modal、CarModal 和 Create 文件。它没有做任何改变。我尝试将 :key="Math.floor(Math.random() * 1000000)" 设置为同一文件上的容器,并在模式关闭时随机更改密钥。它也没有用。我不知道重置表单的任何其他选项。我希望有人能指出我在这里缺少的东西。顺便说一句,我确定当我关闭模态时汽车对象变空了。
我认为问题出在您的商店
actions: {
fillTheCar(state, commit) {
commit("SET_CAR", state.defaults)
},
},
mutations: {
SET_CAR(state, payload) {
state.car = payload
}
}
当我打开模式时,主要对象(汽车)变得等于默认对象,这些默认值填充模式的表单
因此,当您打开模式时,您正在调用 fillTheCar
操作,该操作将依次调用突变 - 结果是,state.car
指向与 state.defaults
相同的对象。因此,当您在模式中更改某些内容时,您实际上也在更改 state.defaults
的属性(应该很容易在 Vue Dev Tools 中检查)
关闭模态时,this.$store.commit("Cars/SET_CAR", {})
只会将 state.car
设置为一个新对象,但当您再次打开它时,它将再次设置为 state.defaults
(已从之前修改)
TLDR
这不是 Vue/Vuex 问题,而是 JavaScript 用法...
要将 state.car
设置为一些默认值,而不是 commit("SET_CAR", state.defaults)
执行 commit("SET_CAR", { ...state.defaults })
...这将创建一个新对象,其中 属性 值是从 [=13= 复制的](假设所有属性都是值类型,如字符串、数字等。即不通过引用传递)
我正在使用 Vue 3 和 Vuex 4。当我打开模式时,主要对象(汽车)变得等于默认对象,并且这些默认值填充模式的表单。下面的代码是简化版。
Vuex 模块:
state: {
car: {}
defaults: {
brand: "",
color: "",
value: ""
...
}
},
actions: {
fillTheCar(state, commit) {
commit("SET_CAR", state.defaults)
},
},
mutations: {
SET_CAR(state, payload) {
state.car = payload
}
}
getters: {
data(state) {
return state.car
}
}
当我填写任何输入字段时,“汽车”对象会按预期更新。当我关闭模式时:
methods: {
closeModal() {
this.$store.commit("Cars/SET_CAR", {})
// I have a different Vuex module to control all toggled items
// such as sidebar, modals, header, etc.
// I change modal visibility on there.
this.$store.commit("Toggles/SET_VISIBILITY", {modal: false}
}
}
我的文件结构是这样的:
App.vue
/ Components
/ Modal.vue
/ Input.vue
/ ...
/ Pages
/ Cars
/ Show.vue
/ Edit.vue
/ Create.vue
/ Delete.vue
/ CarModal.vue
当我去“/cars”路线时,Show.vue显示在App.vue。
当我单击“创建”按钮时,Create.vue 会显示出来,其中包括 CarModal.vue 以及与创建汽车相关的所有功能。
CarModal.vue 具有 CRUD 操作所需的所有表单项,并将其自身注入 /components/Modal.vue
//components/Modal.vue
<template>
<teleport to="body">
<slot name="header"></slot>
<slot name="content"></slot>
<slot name="actions"></slot>
</teleport>
</template>
我希望这些详细信息足以获得帮助。这是我的问题:
如果我填写一些输入并关闭模态,然后重新打开它,它会返回之前填充的输入中的数据,即使我在关闭模态时清空了汽车对象。我尝试使用 v-if 销毁 Modal、CarModal 和 Create 文件。它没有做任何改变。我尝试将 :key="Math.floor(Math.random() * 1000000)" 设置为同一文件上的容器,并在模式关闭时随机更改密钥。它也没有用。我不知道重置表单的任何其他选项。我希望有人能指出我在这里缺少的东西。顺便说一句,我确定当我关闭模态时汽车对象变空了。
我认为问题出在您的商店
actions: {
fillTheCar(state, commit) {
commit("SET_CAR", state.defaults)
},
},
mutations: {
SET_CAR(state, payload) {
state.car = payload
}
}
当我打开模式时,主要对象(汽车)变得等于默认对象,这些默认值填充模式的表单
因此,当您打开模式时,您正在调用 fillTheCar
操作,该操作将依次调用突变 - 结果是,state.car
指向与 state.defaults
相同的对象。因此,当您在模式中更改某些内容时,您实际上也在更改 state.defaults
的属性(应该很容易在 Vue Dev Tools 中检查)
关闭模态时,this.$store.commit("Cars/SET_CAR", {})
只会将 state.car
设置为一个新对象,但当您再次打开它时,它将再次设置为 state.defaults
(已从之前修改)
TLDR
这不是 Vue/Vuex 问题,而是 JavaScript 用法...
要将 state.car
设置为一些默认值,而不是 commit("SET_CAR", state.defaults)
执行 commit("SET_CAR", { ...state.defaults })
...这将创建一个新对象,其中 属性 值是从 [=13= 复制的](假设所有属性都是值类型,如字符串、数字等。即不通过引用传递)