不要直接修改 State

state数据不能直接修改,必须要通过setState来修改。但是设置值的时候不能影响到之前state的值,举个栗子:

// 处理数组,不会改变原有数组
this.setState({list1: this.state.list1.concat(100), // 追加list2: [...this.state.list2, 100], // 追加list3: this.state.list3.slice(0, 3), // 截取list4: this.state.list4.filter(item => item > 100), // 筛选// 其他操作,要先用比如const list5Copy = this.state.list5.slice()生成一个副本,然后再对副本做操作list5: list5Copy
})// 处理对象,不会改变原有对象
this.setState({obj1: Object.assign({}, this.state.obj1, {a: 100}),obj2: {...this.state.obj2, a: 100}
})

处理数组时不要使用push pop splice等方式,处理对象时不要直接对this.state.obj进行属性设置,因为这样违反不要直接修改state原则。

setState更新可能是同步也可能是异步

出于性能考虑,React 可能会把多个 setState() 调用合并成一个调用。比如如下情况:

// 传入对象,会被合并。虽然3次setState, 但count值最后只会加1
this.setState({counter: this.state.counter + 1
})
this.setState({counter: this.state.counter + 1
})
this.setState({counter: this.state.counter + 1
})

此时this.state的更新就是异步更新了。那么有没有办法控制让其同步更新呢?要解决这个问题,可以让 setState() 接收一个函数而不是一个对象。这个函数用上一个 state 作为第一个参数,将此次更新被应用时的 props 做为第二个参数:

// 大括号包裹的箭头函数写return
this.setState((preState, props) => {return {counter: preState.counter + 1}
})
// 小括号包裹的箭头函数不用写return
this.setState((preState, props) => ({counter: preState.counter + 1
}))
// 普通函数形式
this.setState(function(preState, props) {return {counter: preState.counter + 1}
})

这样的话,this.state就可以保持同步更能,最后显示的counter值是3而不是1了。

State 的更新会被合并

在讲setState更新可能是同步也可能是异步的时候已经讲啦。

参考资料

[1] 正确地使用 State

React中使用setState相关推荐

  1. [react] react中的setState执行机制是什么呢?

    [react] react中的setState执行机制是什么呢? 1.将setState传入的partialState参数存储在当前组件实例的state暂存队列中. 2.判断当前React是否处于批量 ...

  2. [react] react中的setState缺点是什么呢?

    [react] react中的setState缺点是什么呢? 调用时机不恰当的话可能引起循环调用的问题:比如在componentWillUpdate render componentDidUpdate ...

  3. [react] react中的setState和replaceState的区别是什么?

    [react] react中的setState和replaceState的区别是什么? setState:更新状态 replaceState:替换状态 个人简介 我是歌谣,欢迎和大家一起交流前后端知识 ...

  4. [react] react中的setState是同步还是异步的呢?为什么state并不一定会同步更新?

    [react] react中的setState是同步还是异步的呢?为什么state并不一定会同步更新? 由React控制的事件处理程序,以及生命周期函数调用setState不会同步更新state . ...

  5. [react] react中调用setState会更新的生命周期有哪几个?

    [react] react中调用setState会更新的生命周期有哪几个? (>=16.4之后,与props的更新一致, <16.4的版本没有static getDerivedStateF ...

  6. react中的setState

    setState的使用 1.1. 为什么使用setState 回到最早的案例,当点击一个 改变文本 的按钮时,修改界面显示的内容: 案例的基础代码如下: import React, { Compone ...

  7. react中的setState详解

    1.setState更新状态的2种写法 (1). setState(stateChange, [callback])------对象式的setState ​ 1.stateChange为状态改变对象( ...

  8. 从源码的角度再看 React JS 中的 setState

    在这一篇文章中,我们从源码的角度再次理解下 setState 的更新机制,供深入研究学习之用. 在上一篇手记「深入理解 React JS 中的 setState」中,我们简单地理解了 React 中 ...

  9. React学习(6)-React中组件的数据-state

    前言 组件中的state具体是什么?怎么更改state的数据? setState函数分别接收对象以及函数有什么区别? 如何划分组件的状态数据,进行自我的灵魂拷问,以及props与state的灵魂对比 ...

最新文章

  1. ActiveMQ的多节点集群
  2. C#学习基本概念之属性使用
  3. 【图像处理】【计算机视觉】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波...
  4. MATLAB 使用CNN拟合回归模型预测手写数字的旋转角度(卷积神经网络)
  5. python 如何将数字字符串转换为数字?
  6. php框架 zend,模型部分的php设计模式[php zend框架]
  7. Thinkpad T61/R61/X61安装XP驱动流程
  8. Knockout v3.4.0 中文版教程-14-控制文本内容和外观-style绑定
  9. 利用PCL做点云的平面拟合
  10. AcWing 1813. 方块游戏(暴力枚举)
  11. JS中style属性
  12. swagger2 配置访问路径_有了Swagger2 再也不用担心API文档的维护了
  13. 啦啦外卖独立版40.4最新外卖源码全开源
  14. 全球尺度遥感云计算平台:Google Earth Engine
  15. 抖音JAVA工程师_字节跳动抖音社招后台开发工程师面经
  16. TCP/IP学习心得
  17. 【One Page】概率论复习|Probability Theory Review
  18. 10天精读掌握:计算机组成与设计COAD:Patterson and Hennessy 第7天 2018/11.1
  19. 联通电信校园促销加码 策略更隐蔽
  20. 利用高德地图API获取任意两座城市之间的距离!异地也有惊喜!

热门文章

  1. 基于S3C2440A+SDRAM(K4M51163)
  2. android 广播观察者,BroadcastReceiver和Activity之间的通信 – android
  3. XHTML Strict和Transitional 的区别
  4. [HDU 1427]速度计算24点(DFS暴力搜索)
  5. Hadoop、Spark、Hbase、Hive的安装
  6. Spring 建立简单的示例
  7. 文件分割器,一个读取流,相应多个输出流,并且生成的碎片文件都有有序的编号...
  8. GideView 动态列模板
  9. 浏览器扩展系列————透明浏览器窗口的实现
  10. MMDetection库部署和训练