используйте функцию 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);
}
}
})
;
При работе с массивами или объектами рекомендуется предотвращать изменчивость, что я обычно делаю с помощью оператора распространения {...myObject}
или [..myArray]
, это предотвратит изменения объекта из другого источника визмените ваш источник, так что это хорошая идея, чтобы реализовать его и в геттерах.
Обновление:
Вот рабочий пример: 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>
. Неважно, какой из них вы выбрали с точки зрения функциональности, но использование геттеров делает код более понятным.