S'il vous plaît voir cet exemple minimum:
MARKUP P>
import Vue from "vue"; import Vuex from "vuex"; import App from "./App.vue"; Vue.use(Vuex); const store = new Vuex.Store({ state: { people: [{ age: 1 }] }, mutations: { changePeople1Works(state) { let people = state.people; people[0].age = people[0].age + 1; }, changePeopleNotWorking(state) { let people = state.people; people[0] = { age: people[0].age + 1 }; } } }); Vue.config.productionTip = false; new Vue({ store, render: h => h(App) }).$mount("#app");
3 Réponses :
de Les docs P>
VUE ne peut pas détecter l'addition ou la suppression de la propriété. P> blockQuote>
et p>
... il est possible d'ajouter des propriétés réactives à un objet imbriqué à l'aide de la méthode VUE.SeSe (objet, nom de propriété, valeur) P> blockQuote>
et p>
VUE ne peut pas détecter les modifications suivantes à un tableau: p>
- Lorsque vous définissez directement un élément avec l'index, par exemple. vm.items [IndexOfitem] = NewValue Li>
- Lorsque vous modifiez la longueur de la matrice, par exemple. vm.items.length = nouvelle-longueur li> ul> blockQuote>
Mais il ne dit rien sur la mutation d'un objet
existant [propriété] code>. p>
Dans le premier exemple, une propriété d'objet existante est en cours de mutation, de sorte que cela fonctionne. (La propriété
Âge Code> du premier élément du
Personnes code> Array.) P> li>
Dans le deuxième exemple, un élément de tableau est en cours de définition par index, de sorte qu'il ne fonctionne pas. (Le
0 code> index du
personnes code> tableau.) P> li> ul>
Cela peut sembler contre-intuitif car un indice de tableau précédemment défini ne peut pas être modifié par index, mais une propriété d'objet définie précédemment peut. P>
Je suppose que la raison de cela a beaucoup à voir avec
objet.defineProperty code>
et le processus de réactivité de VUE. P>(m'a confondu au début aussi.) p>
C'est une mise en garde de la réactivité de Vue.Js.
Vous devez utiliser https://codesandbox.io/s/dreamy-cdn-x90sk?file=/src/main.js P> upd: p> de docs : P> VUE ne peut pas détecter les modifications suivantes à un tableau: p>
Lorsque vous définissez directement un élément avec l'index, par exemple vm.items [IndexOfitem] = NewValue P>
Lorsque vous modifiez la longueur du tableau, par exemple. vm.items.length = nouvelle-longueur p>
blockquote> donc, à l'aide d'un tableau Vous ne pouvez pas modifier l'élément par index (même l'élément existant), car il n'est pas réactif. P> mais vous pouvez utiliser p> par exemple: p> upd 2.
vue.set code> si vous souhaitez modifier le lien vers objet.
Par exemple, il fonctionnera:
1 code> et
2 code> ils ne sont pas les mêmes. Dans le premier exemple, nous ne ré-attribuons pas l'élément de tableau par lien, mais nous modifions la propriété de l'objet observable. Si vous regardez l'état dans
console.log code> vous verrez, que les objets de tableau (qui ont été initialisés) sont observables. Ainsi, Vue est capable de regarder des changements là-bas. P>
Cela n'explique toujours pas ce que postuit. 1 code> et
2 code> Les deux ne doivent pas fonctionner selon les déclarations que vous avez publiées de Vue Docs.
Lorsque vous définissez directement un élément avec l'index, par exemple. vm.items [indexofitem] = newvalue code> op est exactement cela dans
1 code>.
Les propriétés des objets unis sont réactives (définies comme une paire de getter / setter), tandis que les index de tableau ne sont pas:
Cette affectation de l'élément de tableau Résultats dans un objet uni non réactif: p> C'est la limitation de VUE Réactivité pour les tableaux: P> VUE ne peut pas détecter les modifications suivantes à un tableau: p>
Il peut être adressé avec
vm.items [IndexOfitem] = NewValue Code> LI>
vm.items.length = nouvelle-longueur code> li>
ul>
blockQuote>
vue.set code> ou tableau
épissure code>, comme la documentation suggère: P>
let [person, ...people] = state.people;
state.people = [{ age: person.age + 1}, ...people];