Key的优化和SCU优化

49 阅读3分钟

Key的优化

我们在遍历列表时,总是会提示一个警告,让我们加入一个key属性。这和我们修改数据后React的重新渲染有关系。

1.情况一:在最后位置插入数据

  • 这种情况,有无key意义不大。

2.情况二:在前面插入数据

  • 这种情况,在没有key的情况下,所有的li都需要进行修改。

3.当子元素(这里以li为例子)拥有key时,React使用key来匹配原有树上的子元素以及最新树上的子元素

  • 如果原来树上有元素A,B,C,D,新数则是将新元素E插入B和C之间,新树元素为A,B,E,C,D,在li拥有key的情况下(这里将元素的名称作为它们的key),key为C和D的元素仅仅只是进行位移,不需要进行任何其他的修改,然后将key为E的元素插入到C元素前面的位置即可。
  • 如果li没有key,则从B元素开始,后面的所有li都需要进行修改。

4.key的注意事项

  • key应该是唯一的
  • key不要使用随机数(随机数在下一次render时,会重新生成一个数字,导致新旧树在匹配key的时候无法对应上)
  • 使用index作为key,对性能时没有优化的

5.React对diff算法进行优化,将其优化成了O(n)

  • 同层节点之间相互比较,不会跨节点比较
  • 不同类型的节点,产生不同的树结构
  • 开发时,可以通过key来指定哪些节点在不同的渲染下保持稳定

SCU优化

通过shouldComponentUpdate,在shouldComponentUpdate这生命周期中判断当前的state和props是否和更新后的state和props是否发生改变,来决定是否要调用render函数进行更新重新渲染。

以index作为key,删除是删除最后一个

2024.7.22

react使用map生成的元素,key的设定不对导致每次删除都删除最后一个。假设 你的key设置为map中的索引,假设为0,1,2(原dom树),现在你用splice删除掉1,重新渲染时,还是会按map索引按顺序渲染为0,1(新dom树),由于react渲染机制是比较的key值,发现key(0,1)都没变,所以保留原dom树的0,1元素(包括里面内容都不变),而由于数量少了一个,渲染的最后一个就没有渲染,就感觉是删除的最后一个。

主要是比较不同的是通过key进行对比,如果key是index,删除后重新渲染后index顺序是保持不变的,只有数量是可能发生改变,所有key通过对比后,前面的一直都没问题,只有到最后没有新的虚拟DOM的index相对于旧的虚拟DOM的index少了,所以相对于之前的DOM树就少渲染一个元素,看起来就像是删除了最后一个元素。