gpt4 book ai didi

javascript - Vuex - 更新整个数组

转载 作者:数据小太阳 更新时间:2023-10-29 04:25:00 26 4
gpt4 key购买 nike

我有一个 Vue.js 应用程序。这个应用程序使用 Vuex 进行状态管理。我的商店看起来像这样:

const store = new Vuex.Store({
state: {
items: []
},

mutations: {
MUTATE_ITEMS: (state, items) => {
state.items = items;
}
},

actions: {
loadItems: (context, items) => {
context.commit('MUTATE_ITEMS', items);
}
}
})
;

在我的 Vue 实例中,我有以下方法:

loadItems() {

let items = [];
for (let I=0; I<10; I++) {
items.push({ id:(I+1), name: 'Item #' + (I+1) });
}
this.$store.dispatch('loadItems', items);
},

当我运行它时,我注意到我的子组件中的项目列表没有得到更新。我怀疑这是因为 Vue.js 中的 react 模型。但是,我不确定如何更新整个数组。此外,我不确定我是否需要在我的商店变更、商店操作或 Vue 实例方法本身中使用 Vue.set。我有点困惑。

组件:

<template>
<div>
<h1>Items ({{ items.length }})</h1>
<table>
<tbody>
<tr v-for="item in items" :key="item.id">
<td>{{ item.id }}</td>
</tr>
</tbody>
</table>
</div>
</template>

<script>
import { mapState } from 'vuex';

export default {
computed: mapState({
items: state => state.items
})
};
</script>

如何在 Vue.js 应用程序中更新集中存储在 Vuex 中的整个数组?

最佳答案

使用 vue 的 set 函数。这将确保 Vue 的 react 性启动并更新所需的对象。

import Vuex from 'vuex';
const store = new Vuex.Store({
state: {
items: []
},

mutations: {
MUTATE_ITEMS: (state, items) => {
Vue.set(state, 'items', items);
// or, better yet create a copy of the array
Vue.set(state, 'items', [...items]);
}
},

actions: {
loadItems: (context, items) => {
context.commit('MUTATE_ITEMS', items);
}
}
})
;

在处理数组或对象时,防止可变性是个好主意,我通常使用扩展运算符 {...myObject}[..myArray] 这将防止从其他源更改对象以更改您的源,因此最好也在 getter 中实现。


更新:

这是一个工作示例:https://codesandbox.io/s/54on2mpkn (codesandbox 允许您拥有单个文件组件)

我注意到的是您没有任何getter 来帮助获取数据。您可以直接使用计算值或使用 mapGetter 来调用它们。但它们不是强制性的。以下是获取数据的三种方式

<script>
import { mapGetters } from "vuex";
import Item from "./Item";

export default {
name: "ItemList",
components: {
Item
},
computed: {
...mapGetters(["items"]), // <-- using mapGetters
itemsGet() { // <-- using getter, but not mapGetters
return this.$store.getters.items;
},
itemsDirect() { // <--no getter, just store listener
return this.$store.state.items;
}
}
};
</script>

从功能的 Angular 来看,您选择哪一个并不重要,但使用 getter 可以使代码更易于维护。

关于javascript - Vuex - 更新整个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50767191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com