1、setState不会立即改变state的值

2、setState会通过触发组件的更新来触发重绘

setState依次触发以下4个组件的生命周期

1)shouldComponentUpdate(被调用时,state还没有更新,如果返回false,不会再触发其他生命周 期,但是state依然会被更新)

2)componentWillUpdate(被调用时state还没有被更新)

3)render(调用时state已经被更新)

4)componentDidUpdate

3、多次连续的setState会进行合并

//两次连续setState

this.setState({name: ‘xiaoming’})

this.setState({age: 24})

//相当于

this.setState({name: ‘xiaoming’, age: 24})

state源码流程

调用this.setState实际上是调用this.updater.enqueueSetState,每个ReactComponent对象在运行时都会被注入updater属性,我们通过打印Component实例可查看,如图所示:

知道了这个属性,setState源码就十分清晰了

ReactComponent.prototype.setState = (partialState, callback) => {

// this是组件实例

// 将setState、callbackfen放入updater的队列中

this.updater.enqueueSetState(this, partialState)

if(callback) {

this.updater.enqueueCallback(this, callback, ’setState')

}

}

下面看一下真是调用的enqueueSetState方法

enqueueSetState: (publicInstance, partailState) {

// 组件实例有一个_reactInternalInstance属性,可以看成获取该属性

var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, ’setState’)

// 初始化实例的待更新队列

var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = [])

queue.push(partailState)

enqueueUpdate(internalInstance)

}

enqueueSetState内调用的enqueueUpdate

enqueueUpdate: (component) {

//如果不是处于批量创建/更新组件的阶段,就更新当前组件

// batchingStrategy是ReactDefaultBatchingStrategy对象的引用

if(!batchingStrategy.isBatchingUpdates) {

batchingStrategy.batchedUpdates(enqueueUpdate, component)

return;

}

// 如果处于批量更新阶段,则放进脏数组中等待,等待更新

dirtyComponents.push(component)

}

batchingStrategy.isBatchingUpdates,在react中只有两个地方被更新,

自身的batchedUpdates方法,开启批量更新

事务的close方法,设置为false

var ReactDefaultBatchingStrategy = {

//标记是否处于批量更新/新建阶段,默认是false

isBatchingUpdates: false,

//开启批量更新方法

batchedUpdates: function(callback, a, b, c, d, e) {

var alreadyBatchUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;

ReactDefaultBatchingStrategy.isBatchingUpdates = true;

//已经开启了批量更新,调用callback回调,就是enqueueUpdate方法,进去重新等待

if(alreadyBatchUpdates) {

return callback(a, b, c, d, e)

}

// 否则开启事务,进行批量更新

Return transaction.perform(callback, null, a, b, c, d, e)

}

}

java setstate_setState 更新机制学习笔记相关推荐

  1. Java动态性——反射机制学习笔记

    java动态性包括: 反射机制 动态编译 动态执行javascript代码 动态字节码 对动态性的理解 在程序运行过程中(而非编译时),动态地对对象创建及操作 动态语言: python javascr ...

  2. Java的回调机制--学习笔记

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273) 所谓回调: 就是A类中调用B类中的某个方法C,然后B ...

  3. Java并发编程艺术学习笔记(五)

    Java并发编程艺术学习笔记(五) Java并发容器和框架 Java为开发者也提供了许多开发容器和框架,可以从每节的原理分析来学习其中精妙的并发程序. 一.ConcurrentHashMap的实现原理 ...

  4. 零基础学习Java开发,这些学习笔记送给你

    因为Java具备很多特点,并且在企业中被广泛应用为此很多小伙伴选择学习Java基础开发,但是零基础学习Java技术开发需要我们制定Java学习路线图对于我们之后的学习会非常有帮助. 零基础学习Java ...

  5. Java 8 函数式编程学习笔记

    Java 8 函数式编程学习笔记 @(JAVASE)[java8, 函数式编程, lambda] Java 8 函数式编程学习笔记 参考内容 Java 8中重要的函数接口 扩展函数接口 常用的流操作 ...

  6. JAVA基础与高级学习笔记

    JAVA基础与高级学习笔记 /记录java基础与高级,除了较简单的内容,没有必要记录的没有记录外,其余的都记录了/ java初学者看这一篇就够了,全文 6万+ 字. JAVA基础 java会出现内存溢 ...

  7. 《Java编程思想》学习笔记【一对象导论】

    重头学习Java,大一没怎么学,大二上课也没听.(流下不学无术的眼泪) 所有编程语言都提供抽象机制,我们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象," ...

  8. 消息机制学习笔记(四)—— 内核回调机制

    消息机制学习笔记(四)-- 内核回调机制 要点回顾 内核调用 实验1:理解内核调用 第一步:编译并运行以下代码 第二步:修改窗口过程函数,重新运行 KeUserModeCallback 实验2:在OD ...

  9. Windows消息机制学习笔记(三)—— 消息的接收与分发

    Windows消息机制学习笔记(三)-- 消息的接收与分发 要点回顾 消息循环 消息队列 消息的接收 GetMessage 实验1:理解GetMessage 第一步:编译并运行程序A 第二步:编译并运 ...

最新文章

  1. 操作系统学习笔记:进程同步
  2. 润乾转html居中,[分享]润乾报表内置的jsp编辑器
  3. 排序 np_干货 | XGBoost在携程搜索排序中的应用
  4. html.renderaction 控制器,Html.RenderAction简单用法
  5. 如何处理Angular依赖注入的错误消息: NullInjectorError No provider for EffectsRootModule!
  6. 关于uniapp引入Vant Weapp第三方组件,遇到的问题和解决方式
  7. LeetCode MySQL 569. 员工薪水中位数(over窗口函数)
  8. 作者:张岩,男,北京大学教授、博士生导师。
  9. 【MySQL】MySQL 一些 使用 案例
  10. 数据库的运维策略脚本篇(内附脚本,无私分享)
  11. CentOS7下安装 mysql5.7.25(glibc版)(可用)
  12. 等概率随机产生0和1
  13. Java技术图谱!黑马java培训课程目录
  14. 真实诈骗案例积累(一)
  15. 微信小程序注册流程图文详解
  16. 搜狗输入法,怎么打声调?
  17. Windows脚本:打开浏览器访问任意网址
  18. 从零开始学做机器人——入门书籍资料
  19. oracle exp/imp命令使用parfile实现参数文件调用
  20. 美的变频空调保护性停机分析与检修案例

热门文章

  1. 马蜂窝事件背后暴露出的数据风险 1
  2. Oracle 管理多租户环境之CDB管理
  3. 面试 什么场景应该拆分系统,什么场景应该合并系统
  4. Modbus 协议简介
  5. 谈谈职业计算机课程教学体会,职业学校计算机课程教学心得.doc
  6. vue技术点(3)—vuex、插槽、自定义指令、vue动画、keep-alive使用、mixin
  7. 做网站:服务器,云服务器,云主机,虚拟主机有何区别?
  8. 什么是会话劫持攻击以及如何防止会话劫持
  9. Nginx静态资源站点——Nginx地址重写
  10. 图形测试分析毫无头绪HarmonyOS图形栈测试技术帮你解决