位置: 编程技术 - 正文

深入研究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)

  • 实收资本的期末余额在借方还是贷方
  • 应付账款及预付账款分录
  • 公司每年网络费计入什么会计科目
  • 固定资产清理净损失计入什么科目
  • 股东股权转让印花税公司可以报销吗
  • 会计准则体系包括会计制度吗
  • 苗木属于农产品中哪一类
  • 销项税额转出减去还是加上
  • 库存现金贷方为负数说明什么
  • 企业存货实际成本的构成包括
  • 生产加工型企业经营范围
  • 可供出售权益工具投资是非货币
  • 存货内部交易抵消通俗讲解
  • 低值易耗品怎么报废
  • 用于在建工程的贷款利息
  • 自己做的房子可以办房产证吗
  • 年末企业盈利有什么影响
  • 固定资产的知识
  • 公司买了股票怎么做账
  • 小规模企业营业税
  • 价内税包括
  • 广告公司营改增账务处理
  • 企业ci
  • 已抵扣发票丢失如何处理
  • 人工智能对财务人员的挑战与机遇
  • 发票已认证未抵扣怎么办
  • 小规模纳税人可以抵扣增值税专用发票吗
  • 一般纳税人出售不动产增值税税率是多少
  • 跨年度所得税多怎么办
  • mac打印机状态暂停怎么处理
  • 信用卡扣手续费怎么算的
  • 冲减预付款
  • 递延所得税资产是什么意思
  • PHP:pg_field_name()的用法_PostgreSQL函数
  • sbdrvdet.exe - sbdrvdet是什么进程 有什么用
  • 碧峰峡熊猫基地门票
  • 购买二手商住房没有给契税发票和购房发票
  • 混合债清偿顺序
  • 对于个体工商户不需要满足累计经营三个月以上的条件
  • 应收账款项目在资产负债表怎么填列
  • 一次性劳务报酬所得如何扣税
  • 什么是分红型保险?
  • laravel框架关键技术解析
  • vue优化方案
  • web渗透违法吗
  • cnpm安装成功为什么用不了
  • vue.js如何安装
  • uniapp简介
  • 采购的技术服务费需入库吗
  • 销售退回的会计科目
  • 售价金额核算法的优点有
  • 保洁公司的税率是多少
  • 酒店打印要钱吗
  • 内账中已交的增值税在哪
  • 进料料件复出可以给第三方吗
  • 同比增长率环比增长率怎么算
  • 丢失的发票怎么查询
  • 材料入库单金额写含税价吗
  • sql server安装完 C盘空间一直减少
  • sqlserver存储过程返回多个结果集
  • win8 photoshop
  • win10的svchost干什么的
  • linux仿mac
  • xp文件夹选项不见了怎么办
  • ubuntu 14.04.6
  • neoCopy.exe - neoCopy是什么进程 有什么用
  • 在linux系统中
  • sql2000停止拒绝访问
  • js判断手机号
  • 奇门遁甲实例详解
  • bat脚本怎么运行
  • php autoload
  • linux查看so中的函数
  • node.js中使用文件流进行文件复制,首先需要创建一个
  • python开发的程序
  • jquery插件大全
  • javascript文字特效
  • 宁波鄞州区行政区划代码
  • 粮食购销企业税收服务
  • 国税局地税局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设