Vue和React中的key作用

7 篇文章 0 订阅

React和Vue中的key都有提高渲染效率的目的,但是这句话也不是一定的

假设我们有如下顺序的节点

<div>A</div>//	A DOM
<div>B</div>// 	B DOM
<div>C</div>// 	C DOM
<div>D</div>// 	D DOM

如果现在需要在B C之间添加E节点,现在有两种情况,添加key和不添加key

不添加key,渲染节点时会采用就地复用的策略(也是diff算法默认的一个高效策略:避免不必要的重复渲染)

<div>A</div>//	A DOM
<div>B</div>// 	B DOM
<div>E</div>// 	C DOM
<div>C</div>// 	D DOM
<div>D</div>//  新DOM

可以看到,不一定就是使用key就有提高diff算法效率的目的,反而不添加key,就地复用才是官方考虑到的一个提高效率的因素;

另外就是不要使用index作为key值,因为进行插入、删除等,index也会随着相应的改变,现有如下例子,我们将id作为key值查看

假设也是如下节点顺序

A B C D

现在也要在 B C之间插入E节点,如果使用index作为key值的话,插入前A B C D分别对应key 0 1 2 3
,插入后A B C D对应key应该变为了0 1 3 4了,那么C D与之间的C Dkey值不同,diff 算法不认为其是相同的节点,那么就不能复用,加上插入的E需要更新三个节点。,建议使用唯一的ID就不会出现这种情况了

另外一提,Vue源码中判断两个节点是否相等,首先就是判断两个节点的key是否相等


// 判断节点是否相同
function sameVnode (a, b) {
  return (
    a.key === b.key && (
      (
        a.tag === b.tag &&
        a.isComment === b.isComment &&
        isDef(a.data) === isDef(b.data) &&
        sameInputType(a, b)
      ) || (
        isTrue(a.isAsyncPlaceholder) &&
        a.asyncFactory === b.asyncFactory &&
        isUndef(b.asyncFactory.error)
      )
    )
  )
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值