使用track-by属性和v-for有什么意义?

时间:2016-02-29 07:00:42

标签: vue.js

我是vuejs的新手。在我看来,跟踪属性有点难以理解。以下示例显示了track-by属性与数组中的重复元素有关。但是如何在引擎盖下实现v-for属性?当数组中存在重复元素以及 track-by =“$ index”如何产生影响时,行为是什么?

new Vue({

	el: '#app',
  
  data: function() {
  	return {
    	items: [
      	'User Connected',
        'Message',
        'Message',
        'User Connected',
        'Message'
      ]
    }
  },
  
  methods: {
  	addItem: function(item) {
			this.items.push(item);
    }
  }

})
<div id="app">
  <button @click="addItem('User Connected')">Add Connected</button>
  <button @click="addItem('Message')">Add Message</button>

  <ul>
    <li v-for="item in items" track-by="$index">{{ item }}</li>
  </ul>
  <pre>
    {{items | json}}
  </pre>
</div>

https://jsfiddle.net/uuw4z0kr/2/

1 个答案:

答案 0 :(得分:4)

为了反应迅速,Vue尽可能重用DOM元素。因此,如果它已经为特定项目渲染了DOM,它将保存它以便在需要再次渲染的任何时候使用。如果从数组中删除了某些内容,然后重新添加,则使用现有HTML会更快。

但是当数组元素不唯一时,这会导致问题。 Vue无法区分它们。 track-by告诉Vue每个项目的哪个方面是唯一的,因此它可以知道何时重用DOM元素。如果您的数组是一系列具有id属性的对象,则可以使用track-by='id'。但是如果对象没有唯一字段,track-by='$index'会将每个对象与其在数组中的位置相关联。这本质上是一个唯一属性,因此它可以抑制重复条目的错误。