当前位置: 首页 > Web前端 > HTML

为什么React循环DOM时需要添加key

时间:2023-03-27 23:32:57 HTML

一、React渲染过程和更新过程react渲染过程:jsx->virtualdom->realdomReactupdateprocess:props/statechanges->renderfunctionre-executes->生成新的Virtualdomtree->新旧virtualdomtreediff->计算差异并更新->更新到realdomtree所以在每次更新的时候,React都需要根据这两种不同树的差异来判断。有效地更新用户界面。如果一棵树引用另一棵树进行完整的比较更新,那么即使是最先进的算法也具有O(n3)的复杂度,其中n是树中元素的数量。如果在React中使用该算法,那么显示1000个元素所需的计算量将在数十亿量级。这个开销太昂贵了,React的更新性能会变得很低效;所以React对这个算法进行了优化,优化到O(n),也就是传说中的diff算法。二、diff算法diff算法做了三个优化,将同一层的节点相互比较,这样不同类型的节点就不会崩溃,生成不同的树结构在开发中可以使用key指定哪个节点在不同渲染下保持稳定2-1比较不同类型的元素当节点是不同的元素时,React会推倒原来的树并建立新的树树:当一个元素从变为时,从

,或者从
);}insertMovie(){this.setState({movies:[《大话西游》,...this.state.movi??es],});}}代码分析:默认情况下,在递归DOM节点的子元素时,React会同时遍历两个子元素List;当存在差异时,就会产生突变。如果在电影之后添加数据,前两次比较完全相同,所以不会产生变异;最后的比较会产生一个变异,它会被插入到新的DOM树中。是的;如果在movies前面添加数据,React会为每个子元素生成一个mutation,而不是保持
  • Interstellar
  • Inception
  • 不变,这种低效的比较方式会带来一定的性能问题。当子元素(这里是li)有key时,React会根据key去匹配原始树上的子元素和最新树上的子元素:在下面的场景中,key为“Interstellar”和“Inception”的元素"只是移位,没有任何修改;将key为“西游记”的元素插入到最前面;