Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why not always use the index as the key in a vue.js for loop?

Tags:

I have used vue.js for a couple of projects and I have been using the index as the key in the for loops

<div v-for="(item, index) in items" :key="index"></div> 

...and have started to wonder if there are problems with that since examples usually use the ID of the item.

<div v-for="(item, index) in items" :key="item.ID"></div> 
like image 546
getsetbro Avatar asked Jun 13 '17 21:06

getsetbro


People also ask

Can I use index as key Vue?

No indexes as keys You should not use array indexes as keys since indexes are only indicative of an items position in the array and not an identifier of the item itself.

Why key is used in VueJS?

key # The key special attribute is primarily used as a hint for Vue's virtual DOM algorithm to identify vnodes when diffing the new list of nodes against the old list. Without keys, Vue uses an algorithm that minimizes element movement and tries to patch/reuse elements of the same type in-place as much as possible.

What is the use of key attribute?

The Key attribute is used to denote the property that uniquely identifies an entity (the EntityKey ), and which is mapped to the Primary Key field in a database: public class Order. { [Key]

Which directive can be used to loop through an array Vue?

v-for directive is a Vue. js directive used to loop over a data usually an array or object. First, we will create a div element with id as app and let's apply the v-for directive to an element with data.


1 Answers

Because arrays are mutable. The index of any given item can and will change if items are added to or removed from the array.

You want your key to be a unique value identifying only your unique component. A primary key that you create is always better than using an index.

Here is an example.

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>

Note that when addValue is clicked, the list on top represents the new numbers in the array where the truly are in the array; in the middle. In the second list below the button, the values do not represent the actual location in the array and the internal and property values do not agree.

like image 110
Bert Avatar answered Sep 25 '22 06:09

Bert