一、文字

key让React知道,当前新生成的React元素中的元素,是否能在之前生成的React元素中找到对应的。如果有,那么直接拿过来用就行了。假设列表头部插入一项,通过比对,React知道除了头部以外其他地方的项没有变化。React对DOM操作的时候,只需要在头部插入一个节点就可以了。剩余的节点不用动它们。

如果开发者没有设置key,那么React会设置它的key为项在列表中的的索引值。假设头部插入一项,两个React树一对比,React看你第一个元素和之前第一个元素的key一样,只是props改变了(这里我们假设列表每个项的内容不一样)。那只需要对第一个DOM节点做更新。比对第二个元素,React看你和之前第二个元素也一样啊,只是props改变了,那只需要对第二个DOM节点做更新。比对第三个元素,React看你和之前第三个元素也一样啊,只是props改变了,那只需要对第三个DOM节点做更新。。。最后还剩下一个多出来的元素,React一看你的key我之前没见过,那就新创建一个DOM节点插入到上述DOM节点们的末尾。

总结来说:如果原先列表有n项。开发者设置key值的开销就是创建一个DOM节点的开销。

开发者不设置key值的开销就是创建一个DOM节点的开销和更新n个节点的开销。

二、代码

为了更贴切的理解key的作用,可以点击链接查看代码及页面效果。

https://codesandbox.io/s/nervous-bash-3ico9?file=/src/App.js

参考资料:

[1] 理解虚拟DOM及key属性的作用.https://time.geekbang.org/course/detail/100009301-9441

[2] 协调.https://zh-hans.reactjs.org/docs/reconciliation.html

最新文章

  1. Ajax跨域实现
  2. 【前端】提取URL中的各个GET参数
  3. 【转】以 java 为例,总结下 appium 里的一方法的使用心得
  4. asp.net中gridview的checkbox使用总结
  5. Java 创建过滤器 解析xml文件
  6. Android 组件系列-----Activity保存状态
  7. linux查看硬件信息的命令(图文)
  8. java集合类之TreeMap
  9. LeetCode题目答案索引
  10. JQuery EasyUi 扩展combox验证
  11. 如何判断是否按下Ctrl键 - C#
  12. 第七十九,CSS3背景渐变效果
  13. ios开发之自定义textView
  14. IntelliJ IDEA入门系列
  15. mysql字符集问题汇总
  16. UART中的硬件流控RTS与CTS DTR DSR DTE设备和DCE设备【转】
  17. 【转】查看sqlserver被锁的表以及如何解锁
  18. 用PHP发送POST请求
  19. python中的insert
  20. PHP 异步使用swoole的可行性测试

热门文章

  1. Datatable 数据源
  2. 本地GoLand编辑与调试远端服务器上的代码
  3. 基于python的数学建模---scipy库
  4. hashlib加密模块、加密补充说明、subprocess模块、logging日志模块
  5. ubuntu 20.04 / 22.04 运行32位程序
  6. 深入浅出Seata的AT模式
  7. Golang反射修改变量值
  8. 【每日一题】【哈希表,返回结果的下标】2022年1月18日-NC61 两数之和
  9. 【每日一题】【递归实现、自下而上、优化】-2022年1月12日-NC68 跳台阶
  10. K近邻算法(k-nearest neighbor, kNN)