位置: 编程技术 - 正文

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

  • 车船税规定怎么缴纳
  • 进项发票已认证,发现发票有问题怎么办
  • 个人股权激励收入申报
  • 免交城建税的会计分录
  • 2019年印花税税率多少
  • 报废过期产品怎么做会计分录
  • 房屋契税是按照发票上的不含税价格交吗
  • 汇票退回会计分录怎么写
  • 非货物贸易核查项下
  • 企业所得税的营业成本怎么算
  • 公司外籍人员签证如何办理
  • 企业进货不收发票怎么做帐?
  • 个人独资企业核定
  • 印花税是发票吗
  • 进项税额转出怎么申报
  • 结转增值税的计算公式
  • 营改增后印花税计税依据文件
  • 视同销售收入是否缴纳企业所得税?
  • 降低增值税税率对消费者的影响有哪些
  • 用友t3怎样查询报表
  • 电脑开机故障不开机
  • 压缩文件夹发给别人他能看到我桌面上的文件吗
  • 工会经费列支比例
  • 3gwifi怎么用
  • windows7中可以设置控制计算机
  • 公积金托收怎么变更
  • php中用来创建目录的函数是
  • 零售企业进货退税政策
  • 存货的核算方法一次可以选用几个
  • 对外支付代扣代缴附加税享受减免吗
  • 史密斯理工学院
  • 企业会计准则应用指南2023pdf
  • 打造出ChatGPT的,是怎样一群人?
  • 开源cti
  • ai技术排名
  • pdca安全管理方法
  • 公账发工资如何开票
  • 织梦会员功能
  • 免税不能抵扣
  • 汇算清缴报表填报顺序
  • 厂区道路折旧年限最新规定
  • 对股息红利的征税
  • 纳税人应纳税额怎么算
  • 坏账准备的账务处理T型
  • 建筑行业小规模纳税人和一般纳税人
  • 已认证发票是否已抵扣
  • 个税适用税率怎么确定
  • 预付房租摊销
  • 递延所得税当前试用25%,以后15%
  • 当月工资总额如何计算
  • 股权过户费用
  • 怎样单方面注销手机卡
  • 原材料入库单应根据采购订单还是到货数量
  • 如何动态修改mysql的全局参数
  • sqlserver 触发器 redis
  • ubuntu20.04
  • 怎么把ubuntu装在u盘上
  • win7出现正在启动就不动了
  • linux系统中软件包分类
  • windows7功能打不开怎么办
  • centos最小化安装步骤
  • windows找不到硬盘驱动器
  • win7系统检测不到u盘
  • Win7系统打开蓝牙
  • 深入分析的成语
  • node搭建博客
  • python编写人工智能
  • retrofit提交表单
  • 图片批量压缩到200k以下
  • 表格高级使用技巧视频
  • JavaScript驾驭网页-获取网页元素
  • javascript高级程序设计pdf百度云
  • javascript学习指南
  • 江苏省国家税务局发票查询
  • 农产品进项税额核定扣除
  • 河北个体工商户年报入口
  • 一般纳税人简易征收会计分录
  • 村级公益性支出是什么
  • 江西省国家税务局发票查询
  • 沈阳税务局营业时间查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设