Это предупреждение о Vue. js реактивности. Вы должны использовать Vue.set
, если хотите изменить ссылку на объект. Например, это будет работать:
changePeopleNotWorking(state) {
const newPeople = [...state.people];
newPeople[0].age = newPeople[0].age + 1;
Vue.set(state, "people", newPeople);
}
https://codesandbox.io/s/dreamy-cdn-x90sk?file= / src / main. js
UPD:
Из документов:
Vue не может обнаружить следующие изменения в массиве:
Когда вы непосредственно устанавливаете элемент с индексом, например, vm.items [indexOfItem] = newValue
Когда вы изменяете длину массива, например, vm.items.length = newLength
var vm = new Vue({
data: {
items: ['a', 'b', 'c']
}
})
vm.items[1] = 'x' // is NOT reactive
vm.items.length = 2 // is NOT reactive
Таким образом, используя массив, вы не можете изменить элемент по индексу (даже существующий элемент), потому что он не реактивный.
Но вы можете использовать
Vue.set(vm.items, indexOfItem, newValue)
Например:
Vue.set(state.people, 0, { age: state.people[0}.age + 1} )
UPD 2. 1
и 2
они не одинаковы. В первом примере мы не переназначаем элемент массива по ссылке, вместо этого мы меняем свойство наблюдаемого объекта. Если вы посмотрите на состояние в console.log
, вы увидите, что объекты в массиве (которые были инициализированы) являются наблюдаемыми. Таким образом, Vue может наблюдать за изменениями там.