最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • setState源码分析

    正文概述 掘金(前端小板凳)   2021-04-02   584

    在使用React进行业务开发的时候setState可以对组件的数据进行更新并且触发页面的渲染.本文从源码角度梳理在调用setState的相关处理逻辑.

    前置知识

    React多平台渲染

    React在设计上使用了依赖注入的方式,通过注入不同平台的渲染renderer来实现多平台的渲染能力.
    setState源码分析
    在创建组件实例的时候,React会注入不同平台renderer最后结合react-reconciler来实现组件的渲染更新.

    事件循环

    事件循环

    lane

    在react新的架构中定义了lane的概念.lane用于控制不同任务的更新优先级处理逻辑,具体可以参考lane模型

    源码梳理

    基于React的多平台渲染架构,在梳理setState源码是从以下两个方面进行的:

    • 注入渲染renderer(setState从哪里来)
    • 发起调用(setState做了什么)

    注入渲染renderer

    在图说React渲染流程中,React会根据当前的页面结构创建workInProgress树,注入renderer的逻辑就在创建组件实例的过程中.
    在创建类组件的时候,会执行constructClassInstance创建组件的实例.
    setState源码分析
    在constructClassInstance中主要做了如下两件事:

    1. 执行构造函数,创建组件实例
    2. 注入组件更新逻辑实现
      setState源码分析

    在adoptClassInstance中在实例上注入了updater实现了组件的更新注入能力.
    setState源码分析

    发起调用

    在组件的实例化过程中,注入了提供更新能力的updater.调用的逻辑其实就是梳理对应的updater如何触发页面的更新.通常调用setState是如下的方式:

    this.setState({  })
    

    setState是挂载在组件实例上的方法,在创建类组件的时候会调用React类组件的构造函数来初始化实例.
    setState源码分析
    在调用setState的时候其实是调用注入的updater(classComponentUpdater)的enqueueSetState逻辑来实现页面的渲染更新.
    在classComponentUpdater中主要做了:

    1. 创建update 形成update的链表结构(updateQueue) 在更新阶段会依次链表的update
    2. 通过scheduleUpdateOnFiber触发更新

    在scheduleUpdateOnFiber中获取到根节点通过ensureRootIsScheduled发起根节点更新调度.

    ensureRootIsScheduled的功能是在根节点上调度任务的执行,主要功能如下:
    setState源码分析

    • 根据当前任务获取优先级通过Scheduler发起不同优先级的任务调度
    • 同优先级任务合并,不发起新的任务调度

    setState是SyncLanePriority优先级,在调度上就会通过微任务发起调度逻辑等主代码块执行完毕后开启微任务执行(调度更新)

    图解setState更新逻辑

    假设我们在这样一个场景中在一个函数中连续调用的两次setState

    this.setState({  })
    this.setState({  })
    

    第一次调用

    在第一次调用setState的时候在fiber的根节点上创建了updateQueue添加此次的更新内容,通过微任务发起调度.
    setState源码分析

    第二次调用

    第二次调用setState获取的更新优先级跟之前任务一致,这次只进行updateQueue逻辑增加任务的操作
    setState源码分析

    更新任务执行

    微任务执行,开启更新逻辑


    起源地下载网 » setState源码分析

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元