Som*_*ser 8 javascript vue.js vuex
我有一个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);
}
}
})
;
Run Code Online (Sandbox Code Playgroud)
在我的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);
},
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我注意到我的子组件中的项目列表没有得到更新.我怀疑这是因为Vue.js中的反应模型.但是,我不确定如何更新整个阵列.另外,我不确定是否需要Vue.set在我的商店突变,存储操作或Vue实例方法本身中使用.我有点困惑.
零件:
<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>
Run Code Online (Sandbox Code Playgroud)
如何在Vue.js应用程序中更新集中存储在Vuex中的整个Array?
Dan*_*iel 19
使用vue的set功能.这将确保Vue的反应性开始并更新所需的对象.
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);
}
}
})
;
Run Code Online (Sandbox Code Playgroud)
在处理数组或对象时,防止可变性是一个好主意,我通常使用扩展运算符,{...myObject}或者[..myArray]这样可以防止对象从其他源更改以更改源,因此在getter中实现也是个好主意.
这是一个工作示例:https ://codesandbox.io/s/54on2mpkn(codesandbox允许您拥有单个文件组件)
我注意到的是你没有任何吸气剂,那些帮助获取数据.您可以直接使用计算值或使用mapGetters调用它们.但它们不是强制性的.您可以通过以下三种方式获取数据
<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>
Run Code Online (Sandbox Code Playgroud)
从功能角度选择哪一个并不重要,但使用getter可以实现更易维护的代码.
您需要分派以下任何一项操作:
// dispatch with a payload
this.$store.dispatch('loadItems', {items})
// dispatch with an object
this.$store.dispatch({type: 'loadItems',items})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13703 次 |
| 最近记录: |