_
2023/5/11 18:36:464291

上节课我们学习了v-for列表循环,其实我们在使用v-for循环的时候还需要为每一个列表项设置一个key值,这样做有助于提高我们的渲染性能,这个key值,还需要保证它的唯一性。很多人会把这个key设置成index 数组索引,其时这种做法是很不妥当的。如果我们的数组是写死不会发生变动的话,使用index也无所谓。

但是如果我们的数组内容不是固定的,会做一些增删改查的操作,这样就会导致了我们数组索引值发生了变化。key值也相对会发生变化, 数据量大的话可能会造成不必要的性能问题。

维护状态

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。

简单理解:渲染了一个列表,然后改了列表里面的数据,vue它会根据key值一对一比较数据是发生了改变,如果发生了改变,就重新渲染一个列表项(dom)。如果没有发生改变,就使用现有的列表项(dom)只是把现有的列表项排个序而已。

它的判断就是依靠key值来做一对一比较的。当key值对不上的时候,他就会认为数据被修改掉了,需要重新渲染对应的列表项,所以如果key值不固定经常发生改变的话,vue就无法对比出那些新数据和老数据不一致,vue就会默认它被修改了然后给它重新渲染一遍,所以这个时候就会触发一些不必要的渲染操作。

尾部添加

修改之前                                 修改之后

在尾部添加了一条数据,因为其他数据的key值没有发生变化,所以它们不会重新渲染,只会渲染最新添加的这一条,这很符合逻辑。但是假设我们在数组的中间位置或者头部添加数据呢。

中间插入

修改之前                                    修改之后

我们插入了一条数据,却改变了3条数据的key值,vue会渲染3次条数据,这样就出大事情了,当我们数据量大的时候,就因为插入一条数据或者删除一条数据,就会导致后面大量的数据被重新渲染,性能就此拉胯了。

解决方法

在平时后端给我提供的数据中有一个id,这个id它就是一个固定值,我们推荐大家把key属性设置成这个id。这样也能避免我们上面发生性能问题。比如下面例子:

personList:[
          {
            id:1,
            name:"吴某",
            age:18,
            work:"老师"
          },
          {
            id:2,
            name:"罗某",
            age:20,
            work:"老师"
          },
          {
            id:3,
            name:"王某",
            age:22,
            work:"老师"
          }
        ]

html部分

<ul>
   <li v-for="(item,index) in personList" :key="item.id">{{index}}、{{item.name}}-{{key}}:{{item.id}}</li>   
</ul>
视频讲解