v-for中的key

结论
在使用非文本节点的组件,且这个组件没有依赖于响应式的props,此时使用index作为key,那么此时对于列表的删除操作会导致视图错乱。

背景
在动态删除v-for渲染的列表的过程中,如果key指定为index,则可能出现渲染错乱的问题。比如,你的列表有两行,你明明删了第一行,结果却是第二行消失了。

解析
问题源于key的重复,假设你的列表有两行,当你删了第一行,那么第二行的key就变成了第一行的key,这两个key是相同的。基于VirtualDOM的库会把key相同的组件认作同一个组件,因而不会去更新视图。

也就是说,你删了第一行,本来预期的第二行变成了第一行,结果变成因为key相同,最后第一行保持不变,反而是第二行消失了。

大部分时候我们即使使用index作为key,不会复现这个问题,这好像与我们上述分析不符。但是事实上,“使用index作为key并且不会出问题”这种场景,其实过程是这样的:

第一步:通过修改数据删除第一行,数据变化引起vue去更新视图,更新的过程中发现key相同,最终第一行保持不变,反而是第二行消失。这是第一次render。
第二步:第一行的VirtualDOM的确没有变,但是第一行的组件的props变了,由原来第一行的props,变成了第二行的props,由于props变化,第一行的组件需要使用新的props更新视图,最终第一行变成了第二行的样子。这是第二次render。
-----------------------------------

那什么时候可以复现
如果你去删除第一行的过程中,只会触发一次render,那么就会复现问题。也就是说,如果每一行的组件,不依赖于任何“响应式”数据,那么就不会有第二次render,问题就能复现!

特殊情况:如果列表中的组件,是简单的文本节点,文本节点没有props,那么它会不会复现问题呢?

答案是“不会”,Vue的Diff过程对文本节点有特殊处理,不管key一不一样,都会用“新的文本节点”覆盖“旧的文本节点”。

Vue的v-for不绑定key,默认行为和绑定key="index"是差不多的,官方没有默认这种行为的情况下,会导致所有列表DOM重新渲染。key="index"这种行为无法最大化性能,比如在第一个元素插入新元素,会导致所有列表DOM重新渲染。绑定key后,发现绑定的key值的元素变化了,就重新渲染该元素,而不是全部元素都重新渲染,会提高性能。性能主要是DOM渲染影响。key绑定id一类的唯一键好处就是
在列表中插入某个元素,不会像index那样导致后面的元素全部重新渲染,而是根据绑定id的元素是否变化渲染。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值