浏览器 |能够在突变之外进行更新
Vuex | Be able to update outside of a mutation
我正在尝试更新通过 Vuex 控制的动作的状态。我最初知道,如果不直接通过突变进行操作,我将无法更新操作的状态。但是,我并不想这样做,因为我正试图在回调中使用它。所以我试图克隆这个动作数组,然后使用这个变量。但是,这似乎会产生相同的错误:
do not mutate vuex store state outside mutation handlers
每当我的模态发生变化时,我都会添加一个观察器,它会检查模态是否有动作,以及它是否使用 for 循环将其“克隆”到局部变量。
@Watch('modal')
onModalChanged(modal: ModalData) {
if (modal && modal.actions) {
for (let i = 0; i < modal.actions.length; i++) {
this.actions[i] = modal.actions[i];
}
}
}
然后我的模板中有一个 v-for
循环,它循环遍历动作局部变量并执行 @click
。
构造模态时,动作设置如下:
modalStore.show({
...,
actions: [
{
text: 'Save',
theme: 'positive',
click: (action: Action) => {
}
}
]
});
在点击方法中,我希望能够设置动作的加载状态,即
click: (action: Action) => {
action.loading = true;
}
这样,我可以确定按钮是否应该显示加载状态,但这就是问题所在,因为我得到了 do not mutate vuex store。
我是否必须经历一个状态,因为模态可能有多个状态,这意味着我必须制作如下所示的方法:
updateButtonState(modal: ModalData, actionIndex: number, loading: boolean) {
modal.actions[actionIndex].loading = true;
}
但是在创建模态时,我没有为模态传入的引用。
是否有解决方法或更好的方法来解决这个问题?
action.loading = true
的最小方法是理想的,尽管我知道这可能无法实现。
首先,您现在应该知道对象(数组也是对象)是按 link 处理的,而不是按值处理的。因此,如果你想复制一个数组,你应该制作这个 this.copy = [...this.original]
然后你将能够更改副本数组而不更改商店中的原始数组。
但是,如果您还需要在商店中对其进行更新,唯一的方法就是使用 mutations 进行更新。在这个突变中,你可以传递一个带有数组索引的对象,你可以保存的值等等。
我正在尝试更新通过 Vuex 控制的动作的状态。我最初知道,如果不直接通过突变进行操作,我将无法更新操作的状态。但是,我并不想这样做,因为我正试图在回调中使用它。所以我试图克隆这个动作数组,然后使用这个变量。但是,这似乎会产生相同的错误:
do not mutate vuex store state outside mutation handlers
每当我的模态发生变化时,我都会添加一个观察器,它会检查模态是否有动作,以及它是否使用 for 循环将其“克隆”到局部变量。
@Watch('modal')
onModalChanged(modal: ModalData) {
if (modal && modal.actions) {
for (let i = 0; i < modal.actions.length; i++) {
this.actions[i] = modal.actions[i];
}
}
}
然后我的模板中有一个 v-for
循环,它循环遍历动作局部变量并执行 @click
。
构造模态时,动作设置如下:
modalStore.show({
...,
actions: [
{
text: 'Save',
theme: 'positive',
click: (action: Action) => {
}
}
]
});
在点击方法中,我希望能够设置动作的加载状态,即
click: (action: Action) => {
action.loading = true;
}
这样,我可以确定按钮是否应该显示加载状态,但这就是问题所在,因为我得到了 do not mutate vuex store。
我是否必须经历一个状态,因为模态可能有多个状态,这意味着我必须制作如下所示的方法:
updateButtonState(modal: ModalData, actionIndex: number, loading: boolean) {
modal.actions[actionIndex].loading = true;
}
但是在创建模态时,我没有为模态传入的引用。
是否有解决方法或更好的方法来解决这个问题?
action.loading = true
的最小方法是理想的,尽管我知道这可能无法实现。
首先,您现在应该知道对象(数组也是对象)是按 link 处理的,而不是按值处理的。因此,如果你想复制一个数组,你应该制作这个 this.copy = [...this.original]
然后你将能够更改副本数组而不更改商店中的原始数组。
但是,如果您还需要在商店中对其进行更新,唯一的方法就是使用 mutations 进行更新。在这个突变中,你可以传递一个带有数组索引的对象,你可以保存的值等等。