关于React 与 Vue 列表加key

遍历对象的每一个属性的深度对比是非常浪费性能的 .
React & Vue 使用列表的key来进行对比, 如果不指定就会默认为index为下标 .
那么, 为什么不指定key, 而用index为下标是不好的呢?

假设现在有一段这样React代码 :

const users = [{ name: "zhangsan" }, { name: "lisi" }];
users.map((item, index) => <div key={index}>{item.name}</div>);

它会渲染出的这个DOM树 :

<div key="1">zhangsan</div>
<div key="2">lisi</div>

如果我们把users通过unshift一项:

const users = [
  { username: "wanger" },
  { username: "zhangsan " },
  { username: "lisi" },
];

此时的DOM树就会变成这样, 注意key的变化

<div key="1">wanger</div>
<div key="2">zhangsan</div>
<div key="3">lisi</div>

DOM树的前后对比是这样的 :

<div key="1">zhansan</div>   |  <div key="1">wanger</div>
<div key="2">lisi</div>      |  <div key="2">zhangsan</div>
                             |  <div key="3">lisi</div>

表面上看的出来前后的变化只是在开头加了一个wanger而已 .
但是由于React使用key值来识别变化, 所以React认为的变化是 :

zhangsan => wanger
lisi => zhangsan
添加 lisi

此时React内部程序执行了这三步操作, 非常消耗性能
如果我们一开始就给它指定一个合适的key, 比如用name :

users.map((item, index) => <div key={item.name}>{item.name}</div>)

React 认为的变化就变成 :


                             |  <div key="1">wanger</div>
  <div key="1">zhansan</div> |  <div key="2">zhangsan</div>
  <div key="2">lisi</div>    |  <div key="3">lisi</div>

这样只需要做一个unshift操作, 性能节省

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值