深入掌握 react的 setState的工作机制


Posted in Javascript onSeptember 27, 2017

react 是单向数据流,若想要改变已有组件的外观,我们只能通过更改组件的 props 或者更新组件的 state。在 react 项目的代码中我们操作最多的就是 this.setState 方法。下面对 setState 方法进行详细的说明。

<!--more -->

setState要点:react 框架为了提高性能,会对 state 的更新进行收集、合并、再进行一次批量的状态更新。这种机制常常导致一些意想不到的情况。

setState 有两种调用形式:

向 setState 传递对象
setState()并不会立即触发 state 的更新。

//this.state.demo = 1;
handleClick = () => {
  this.setState({demo: 2});
  console.log(this.state.demo);// 1
}

1、?注意:在 addEventListener、setTimeout、ajax 回调中 this.setState 是立即触发的。

2、setState 会合并更新,可能会造成状态更新的丢失

handleClick = () => {
  this.setState({demo: this.state.demo + 1});
  this.setState({demo: this.state.demo + 1});
}
//click 之后 demo 为2而不是3

综上:在同一代码块中不要多次调用 this.setState 方法

react 的 setState 还提供了另一种调用形式: this.setState(callbackFunc)

this.setState((previousState, currentProps) => {
  return { ...previousState, foo: currentProps.bar };
});

该语法和直接为 setState 传递对象不同,不会合并更新。

// demo + 1
handleSyncStateChange = () => {
  this.setState({
    demo: this.state.demo + 1
  });
  this.setState({
    demo: this.state.demo + 1
  });

}
// demo + 2
handleAsyncStateChange = () => {
  this.setState((preState, preProps) => {
    return {
      demo: preState.demo + 1
    }
  });
  this.setState((preState, preProps) => {
    return {
      demo: preState.demo + 1
    }
  });
}

refs

Async Nature Of setState

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中的变量作用域以及变量提升详细介绍
Oct 24 Javascript
Node.js中的事件驱动编程详解
Aug 16 Javascript
angular中使用路由和$location切换视图
Jan 23 Javascript
jQuery插件slides实现无缝轮播图特效
Apr 17 Javascript
JavaScript中的Number数字类型学习笔记
May 26 Javascript
简单总结JavaScript中的String字符串类型
May 26 Javascript
JavaScript中点击事件的写法
Jun 28 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
Aug 21 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
Oct 21 Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 jQuery
Array数组对象中的forEach、map、filter及reduce详析
Aug 02 Javascript
vuex的module模块用法示例
Nov 12 Javascript
JavaScript 保护变量不被随意修改的实现代码
Sep 27 #Javascript
JavaScript实现打印星型金字塔功能实例分析
Sep 27 #Javascript
微信小程序 按钮滑动的实现方法
Sep 27 #Javascript
详解Vue-cli代理解决跨域问题
Sep 27 #Javascript
jQuery 利用ztree实现树形表格的实例代码
Sep 27 #jQuery
javascript 作用于作用域链的详解
Sep 27 #Javascript
深入理解Vue2.x的虚拟DOM diff原理
Sep 27 #Javascript
You might like
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
2018/05/02 Javascript
js实现选项卡效果
2020/03/07 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
使用Eclipse如何开发python脚本
2018/04/11 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
python中return不返回值的问题解析
2020/07/22 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
解决python3输入的坑——input()
2020/12/05 Python
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
创业计划书六个要素
2013/12/26 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
家长学校培训材料
2014/08/20 职场文书
个人授权委托书样本
2014/09/13 职场文书
防火标语大全
2014/10/06 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python