二、DOM中的diffing算法(Vue/React中绑定的key)

key在Vue和React中用于标记虚拟DOM,帮助框架识别变化,减少不必要的DOM更新。使用唯一ID作为key能避免数据逆序操作时的效率问题和界面错位。若仅用于数据展示,index作为key是合适的。
摘要由CSDN通过智能技术生成

问题:Vue/React中绑定的key是什么?有什么作用?

key是虚拟DOM对象的标识,在数据的更新显示中起到非常重要的作用。
当页面中的数据发生变化时,react会根据“新数据”生成“新的DOM”,但是当数据只有部分发生变化时,React是否会一次性更新页面中的所有DOM呢?
答案是否定的。那么React又是如何辨别哪些是重复DOM,哪些是“新的DOM”呢?
此时利用的就是这个key值了。

实现过程:

若在旧虚拟DOM找到了与新虚拟DOM中相同的key:
(1)若虚拟DOM中内容没变,则直接使用之前的真实DOM
(2)若虚拟DOM中内容变了,则生成新的真实DOM,替换掉页面中真实的DOM
若在旧虚拟DOM中没找到与新虚拟DOM中相同的key:
则根据数据创建新的真实DOM,然后渲染到页面上

使用index作为key可能出现的一些问题:

在程序中最好使用唯一的id标识作为key,可以避免以下的问题
若对数据进行逆序操作时,比如在数组的前面插入一个数据,此时,若使用index作为key,则新插入数据的key值为0,原先的数据key值都发生了变化(在原先的基础上+1),根据diffing算法,所有的DOM都需要重新渲染,但是页面上行真正发生变化的其实只有新添加的数据,导致产生了没有必要的的真实DOM的更新,影响效率问题

<!-- 初始数据 -->
[
	{id:1, name:'Tom'},
	{id:2, name:'Jerry'}
]
<!-- 初始的虚拟DOM -->
<li key=0>Tom<input type="text" /></li>
<li key=1>Jerry<input type="text" /></li>
<!-- 向数组前插入一条数据 -->
[
	{id:0, name:'Bob'},
	{id:1, name:'Tom'},
	{id:2, name:'Jerry'}
]
<li key=0>Bob<input type="text" /></li>
<li key=1>Tom<input type="text" /></li>
<li key=2>Jerry<input type="text" /></li>
<!-- 此时真正的新数据其实只有Bob,但是由于key全部改变,
则整个数据重新渲染 -->

上面导致的问题不仅仅是数据全部的重新渲染,还导致了另一个更为严重的问题,由于在结构中还包含了输入类的DOM,会导致界面出现问题。原来input标签并不会重新渲染,若原先input输入框中有对应的name,那么会在数据重新插入后,导致“错位”

<!-- 原先 -->
<li key=0>Tom————输入框中为Tom</li>
<li key=1>Jerry————输入框中为Jerry</li>
<!-- 更新后 -->
<li key=0>Bob————输入框中为Tom</li>
<li key=1>Tom————输入框中为Jerry</li>
<li key=2>Jerry————<input type="text" /></li>
<!-- 页面结构混乱 -->

注意:
如果不存在对数据的逆序添加、删除等破坏顺序操作,仅仅是用于渲染数据展示,那么使用index作为key是没有问题的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值