J'ai utilisé vue.js pour quelques projets et j'ai utilisé l'index comme clé dans les boucles for
<div v-for="(item, index) in items" :key="index"></div>
... et ont commencé à se demander s'il y avait des problèmes avec cela, car les exemples utilisent généralement l'ID de l'article.
<div v-for="(item, index) in items" :key="item.ID"></div>
Parce que les tableaux sont mutables. L'index d'un élément donné peut et va changer si des éléments sont ajoutés ou supprimés du tableau.
Vous voulez que votre key
soit une valeur unique identifiant uniquement votre composant unique. Une clé primaire que vous créez est toujours meilleure que l'utilisation d'un index.
Voici un exemple.
console.clear()
Vue.component("item", {
props: ["value"],
data() {
return {
internalValue: this.value
}
},
template: `<li>Internal: {{internalValue}} Prop: {{value}}</li>`
})
new Vue({
el: "#app",
data: {
items: [1, 2, 3, 4, 5]
},
methods: {
addValue() {
this.items.splice(this.items.length / 2, 0, this.items.length + 1)
}
}
})
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
<div id="app">
{{items}}
<ul>
<item v-for="i in items" :value="i" :key="i"></item>
</ul>
<button @click="addValue">AddValue</button>
<ul>
<item v-for="(i, index) in items" :value="i" :key="index"></item>
</ul>
</div>
Notez que lorsque addValue
est cliqué, la liste en haut représente les nouveaux nombres dans le tableau où les vraiment sont dans le tableau; au milieu. Dans la deuxième liste sous le bouton, les valeurs ne représentent pas l'emplacement réel dans le tableau et les valeurs internes et de propriété le font pas d'accord.
console.clear()
Vue.component("item", {
props: ["value"],
data() {
return {
internalValue: this.value
}
},
template: `<li>Internal: {{internalValue}} Prop: {{value}}</li>`
})
new Vue({
el: "#app",
data: {
items: [{name:'a'},{name:'b'},{name:'c'}]
},
methods: {
addValue() {
this.items = [{name:'a'},{name:6},{name:'b'},{name:'c'}];
}
}
})
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
<div id="app">
{{items}}
<ul>
<item v-for="i in items" :value="i.name" :key="i"></item>
</ul>
<button @click="addValue">AddValue</button>
<ul>
<item v-for="(i, index) in items" :value="i.name" :key="index"></item>
</ul>
</div>
Pour être plus clair