位置: 编程技术 - 正文

深入研究React中setState源码(深入react技术栈)

编辑:rootadmin

推荐整理分享深入研究React中setState源码(深入react技术栈),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解react,react useimperativehandle,深入react技术栈pdf,深入react技术栈pdf,深入react技术栈pdf,react理解,深入理解react,react深入浅出,内容如对您有帮助,希望把文章链接给更多的朋友!

React作为一门前端框架,虽然只是focus在MVVM中的View部分,但还是实现了View和model的绑定。修改数据的同时,可以实现View的刷新。这大大简化了我们的逻辑,只用关心数据流的变化,同时减少了代码量,使得后期维护也更加方便。这个特性则要归功于setState()方法。React中利用队列机制来管理state,避免了很多重复的View刷新。下面我们来从源码角度探寻下setState机制。

1 还是先声明一个组件,从最开始一步步来寻源;

所以主要来看是否传入了updater参数,也就是说何时进行 new 组件;具体的updater参数是怎么传递进来的,以及是那个对象,参见

react源码分析系列文章下面的react中context updater到底是如何传递的

这里直接说结果,updater对象其实就是ReactUpdateQueue.js 中暴漏出的ReactUpdateQueue对象;

2 既然找到了setState之后执行的动作,我们在一步步深入进去

ReactUpdateQueue.js

深入研究React中setState源码(深入react技术栈)

可以看到enqueueSetState enqueueCallback 最后都会执行enqueueUpdate;

ReactUpdates.js

ReactDefaultBatchingStrategy.js

接下来我们看下React中的事物处理机制到底是如何运行的;

Transaction.js

接着会执行ReactUpdates.js中的flushBatchedUpdates方法

ReactUpdates.js中

ReactReconciler.js中

ReactCompositeComponent.js

this.state的更新会在_processPendingState执行完执行。所以两次setState取到的都是this.state.count最初的值0,这就解释了之前的现象。其实,这也是React为了解决这种前后state依赖但是state又没及时更新的一种方案,因此在使用时大家要根据实际情况来判断该用哪种方式传参。来看个小例子直观感受下

setState流程还是很复杂的,设计也很精巧,避免了重复无谓的刷新组件。它的主要流程如下

enqueueSetState将state放入队列中,并调用enqueueUpdate处理要更新的Component 如果组件当前正处于update事务中,则先将Component存入dirtyComponent中。否则调用batchedUpdates处理。 batchedUpdates发起一次transaction.perform()事务 开始执行事务初始化,运行,结束三个阶段 初始化:事务初始化阶段没有注册方法,故无方法要执行 运行:执行setSate时传入的callback方法,一般不会传callback参数 结束:更新isBatchingUpdates为false,并执行FLUSH_BATCHED_UPDATES这个wrapper中的close方法 FLUSH_BATCHED_UPDATES在close阶段,会循环遍历所有的dirtyComponents,调用updateComponent刷新组件,并执行它的pendingCallbacks, 也就是setState中设置的callback。

标签: 深入react技术栈

本文链接地址:https://www.jiuchutong.com/biancheng/369824.html 转载请保留说明!

上一篇:不使用 JS 匿名函数理由(js匿名函数作用域)

下一篇:JavaScript canvas实现围绕旋转动画(javascript的canvas)

  • 企业所得税核定征收税率表最新
  • 企业所得税税负率怎么算出来的
  • 外币借款本金的汇兑差额
  • 可转债中签后怎么操作卖出
  • 广告设计要交文科生吗
  • 通过固定资产科目核算
  • 公司打到个人账户需要多久
  • 网上报税需要准备什么资料
  • 信息技术服务企业研发费用加计扣除
  • 已缴企业所得税公司账户的钱怎么办
  • 成品油增值税抵减政策
  • 有限合伙企业jp
  • 收到跨境分红的会计处理怎么做?
  • 企业比赛奖品买什么好
  • 自产产品对外捐赠需要缴纳增值税吗
  • 如何查询已开出的增值税发票是否被认证
  • 发票一定要房东开的才能报销吗?
  • 公司与股东的往来款涉税
  • 分公司不独立核算需要开银行账户吗
  • 工业企业销售管理制度
  • 购入样品账务处理
  • 工程项目预缴税金
  • 房地产企业预缴增值税如何申报
  • 医疗废物处置费是什么意思
  • Win10打开浏览器后自动弹出查找框
  • 苹果电脑隐藏软件功能怎么开启
  • 债权转增资本公积账务处理
  • php中split
  • 修建污水处理厂施工方案包括哪些内容
  • 销售商品取得的货款
  • PHP:imagecopyresampled()的用法_GD库图像处理函数
  • 原材料入库时如何计价
  • 什么是跨域以及跨境电商
  • php curl_init
  • mysql函数nvl
  • 购买房屋用于出租属于投资行为吗
  • 工会组织机构需要备案吗
  • 劳务公司开发票劳务公司如何转取收入?
  • mongodb如何修改数据
  • 售后服务费计提政策
  • 如何快速删掉通讯录联系人
  • 金税四期查到了怎么办
  • 存货抵债如何做分录
  • 母子公司往来款属于借款吗
  • 买商品赠送赠品怎么做账
  • 企业送给客户的礼品怎么做分录
  • 购买材料时如果没有取得购买材料的发票
  • 先付款后开票还是先开票后付款
  • 公司注销留抵税额怎么做进项转出
  • 房地产开发企业销售自行开发的房地产项目
  • 营业收入要包括什么
  • 公司暂估成本分录
  • 餐费补贴属于工资还是福利费
  • 物流货到付款可以吗
  • sql server设置主键primary key
  • MySQL 5.0.96 for Windows x86 32位绿色精简版安装教程
  • win8系统中断怎么解决
  • windows自带的
  • centos7.6ssh
  • windows10预览版安装
  • tvt_reg_monitor_svc.exe进程是什么
  • windows7字体安装方法
  • linux校验文件
  • wget下载命令
  • xp系统的设置在哪里
  • linux工具包
  • bat批处理命令大全
  • 批处理文件是脚本吗
  • matplotlib pypi
  • our与my的区别
  • opengl glu
  • 浏览器复制插件在哪
  • shell编程入门
  • 《JavaScript高级程序设计》pdf链接
  • jquery的遍历方法
  • 中国税务社保缴费app下载
  • 社保在线审核
  • 纳税申报期限和税款缴纳期限一样吗
  • 单位纳税人什么意思
  • 税务局政务公开目录
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设