?友达在vue2.x文档中明确指出:建议在使用v-for时尽量提供key属性,除非遍历输出的DOM内容非常简单,或者故意依赖默认行为来表现收益。游达的建议很简单:如果索引可以作为key,那么底层就可以给你传入,何必呢?那就乖乖别用index当key:key有什么用?Vue.js在使用v-for更新渲染元素列表时,默认使用就地重用策略。这是什么意思?让我们一起讨论吧。diff算法只是比较新旧虚拟dom。如有差异,以新的为准,再插入真实dom重新渲染key的功能。一句话:key的作用主要是为了更高效的比较虚拟DOM中的各个节点是否是同一个节点;举个简单的例子,三胞胎连打,你怎么知道谁是老大?如果老板有点紧张并与第三者交换位置,您会如何区分?给他们挂个牌子,写老大,老二,老三。这样你就不会弄错了。关键是为了这个目的。通过键管理状态Vue默认根据“就地更新”策略更新由v-for渲染的元素列表。当数据项的顺序发生变化时,Vue不会相应地移动DOM元素的顺序,而是原地更新每个元素,以确保它们在最初指定的索引位置呈现。默认模式是高效的,但只适用于列表渲染输出的结果不依赖于子组件状态或临时DOM状态(例如表单输入值)的情况。为了给Vue一个提示,以便它可以跟踪每个节点的身份,从而重用和重新排序现有元素,您需要为每个元素的对应块提供一个唯一的键属性:在没有键的情况下,Vue的一种算法是最小化元素移动将被使用,并且相同类型的元素将尽可能地就地更新/重用。如果传递了key,元素将按照key变化的顺序重新排列,key不存在的元素将始终被删除/销毁。同一父元素下的子元素必须具有唯一键。重复键会导致渲染效率异常&Bug说到这里,有些人只是认为这是一个简单的效率问题。确实:设置key可以让diff效率更高,但难道只是重绘重排?答案是不。如果它只是效率低下,那么可以操作的元素很少也没有什么坏处。但是使用index带来的问题就麻烦多了
