首页 > 其他分享 >React如何更快的完成diff的比较

React如何更快的完成diff的比较

时间:2022-10-25 23:01:59浏览次数:51  
标签:Fiber 复用 React 判断 更快 key diff 节点

diff算法是能够更加高效快捷更新页面元素的算法,那如何帮助diff更快呢?

那答案就一定是合理的使用key。

diff的调用是在reconcileChildren中的reconcileChildFibers,当没有可以复用current fiber节点时,就会走mountChildFibers,当有的时候就走reconcileChildFibers

reconcilerChildFibers的函数中则会针render函数返回的新的jsx数据进行判断,它是否是对象,就会判断它的newChild.$$typeof是否是REACT_ELEMENT_TYPE,如果是就按单节点处理。 如果不是继续判断是否是REACT_PORTAL_TYPE或者REACT_LAZY_TYPE

继续判断它是否为数组,或者可迭代对象。

而在单节点处理函数reconcileSingleElement中,会执行如下逻辑:

  • 通过 key,判断上次更新的时候的 Fiber 节点是否存在对应的 DOM 节点。 如果没有 则直接走创建流程,新生成一个 Fiber 节点,并返回
  • 如果有,那么就会继续判断,DOM 节点是否可以复用?

<!---->

  • 如果有,就将上次更新的 Fiber节点的副本作为本次新生的Fiber 节点并返回

<!---->

  • 如果没有,那么就标记 DOM 需要被删除,新生成一个 Fiber 节点并返回。

React 是如何判断一个 Fiber 节点是否可以被复用的。

  • 第一步:判断elementkeyfiberkey 是否相同

<!---->

  • 如果不相同,就会创建新的 Fiber,并返回

<!---->

  • 第二步:如果相同,就判断element.typefibertype 是否相同,type 就是他们的类型,比如p标签就是p,div标签就是div.如果 type 不相同,那么就会标识删除。

<!---->

  • 如果相同,那就可以可以判断可以复用了,返回existing

而在多节点更新的时候,key的作用则更加重要,React 会通过遍历新旧数据,数组和链表来通过按个判断它们的keytype 来决定是否复用。

言而总之,需要合理的使用key来加快diff算法的比对和fiber的复用。

那么如何合理使用key呢。

其实很简单,只需要每一次设置的值和我们的数据一直就可以了。不要使用数组的下标,这种key和数据没有关联,我们的数据发生了更新,结果 React 还指望着复用。

标签:Fiber,复用,React,判断,更快,key,diff,节点
From: https://blog.51cto.com/u_15743951/5795149

相关文章

  • React_转变状态实例代码
    import{useState}from"react";import'./App.css';functionApp(){ const[redBorder,setRedBorder]=useState(false);  //useState()中的false是redBord......
  • ReactorKit的使用(单向数据流架构) swift
    Reactor的最大的作用就是将业务逻辑从View中抽离出来,可以让我们代码分工变的更加清晰明朗,多人开发时也便于后期的管理和维护。ReactorKit是一个面向响应式单向Swift应......
  • React进阶篇——二、组件与服务器通信
    二、组件与服务器通信1,组件挂载阶段通信componentDidMount是调用服务器API最安全的地方,也是React官方推荐的进行服务器通信的地方。除了在componentDidMount,在componentW......
  • React性能优化的8种方式
    一引沿Fiber架构是React16中引入的新概念,目的就是解决大型React应用卡顿,React在遍历更新每一个节点的时候都不是用的真实DOM,都是采用虚拟DOM,所以可以理解成fiber就是R......
  • React核心工作原理
    ##1.1、虚拟DOM常见问题:reactvirtualdom是什么?说一下diff算法?拿到一个问题,一般回答都是是什么?为什么?怎么办?那就按照这个思路来吧!what用JavaScript对象表示DOM......
  • React的5种高级模式
    本文概述了5种现代高级React模式,包括集成代码、优点和缺点,以及在公共库中的具体用法。像每个React开发者一样,你可能已经问过自己以下问题之一我如何建立一个可重复使用......
  • React生命周期深度完全解读
    在React中,对于每一次由状态改变导致页面视图的改变,都会经历两个阶段:render阶段、commit阶段。只有class组件才有生命周期,因为class组件会创建对应的实例,而函数组......
  • 百度前端高频react面试题总结
    可以使用TypeScript写React应用吗?怎么操作?(1)如果还未创建CreateReactApp项目直接创建一个具有typescript的CreateReactApp项目:npxcreate-react-appdemo-......
  • 一天梳理完React所有面试考察知识点
    性能优化性能优化,永远是面试的重点,性能优化对于React更加重要在页面中使用了setTimout()、addEventListener()等,要及时在componentWillUnmount()中销毁使用异步组件......
  • react是如何实现事件代理的
    _版本:v18.2.0本文为我花了大半年的时间潜心研究所写,转载请注明出处,谢谢react是如何实现事件代理的createRoot函数**用户在index.tsx中执行ReactDOM.createRoot创建roo......