React —(setState 方法)
来源:互联网 发布:淘宝买dota2饰品 编辑:程序博客网 时间:2024/04/29 17:12
1、setState 方法易犯错点。
- setState 不会立即改变 React 组件中的 state 的值。
- setState 通过引发一次组件的更新过程引发重新绘制。
- 多次 setState 函数调用产生的效果会合并。
2、setState 方法
在 React 中,一个组件要读取当前的状态只需要访问 this.state 属性,但是更新状态需要调用 this.setState() 方法。
// 读取状态this.state.xxx// 更新状态this.setState({...});
若使用 this.state.xxx
赋值更新状态,的确能够改变状态,但是无意义,也不会触发重新渲染。
因为,this.state 只是一个对象,单纯去修改一个对象的值无意义,去驱动 UI 的更新才是有意义的。
而 setState 方法被调用时,能驱动组件的更新过程,引发 shouldComponentUpdate、componentWillUpdate、 reader、 componentDidUpdate 等一系列方法调用,完成 UI 更新。
3、setState 不会立刻改变 React 组件中的 state 值。
// 初始化this.state = { count: 0};// 操作let count = this.state.count;console.log(count); this.setState({count: count + 1});console.log(this.state.count);// 输出 0 0
由于 setState
并不会立即修改 this.state
的值,所以调用完 this.setState
方法后获取 this.state.count
依旧是旧值 0。
4、setState 通过引发一次组件的更新过程来引发重新绘制
setState 方法被调用时,会引起 React 的 4 个生命周期的函数被调用:
- shouldComponentUpdate (this.state 没有得到更新)
- componentWillUpdate (this.state 没有得到更新)
- reader (this.state 得到更新)
- componentDidUpdate
(比修改 props 引发的生命周期少一个 componentWillReceiveProps 函数)。
当 shouldComponentUpdate 函数返回 false 时,更新过程将被打断,render 函数不会被调用,但是依旧会更新 this.state。
5、多次 setState 函数调用会合并
React 中利用队列机制来管理 state ,并且会将多个 state 合并,以避免不必要的渲染。
this.setState({FirstName: 'Mo'});this.setState({LastName: 'Chen'});
上面代码连续调用了两次 this.setState,但是只会引发一次更新生命周期。因为 React 会将多个 this.state 产生的修改放在一个队列里。在每次更新过程中,会把积攒的 setState 结果合并,所以上述代码相当于:
合并 state 相当于 =>this.setState({ FirstName: 'Mo', LastName: 'Chen' });
注意:由于多次调用 setState 会发生合并效果,所以当连续修改同一个状态时,新值将覆盖旧值。
this.setState({count: this.state.count + 1});this.setState({count: this.state.count + 2});
上述代码的执行效果是,在 count 原有的基础上加 2,并不是 3,这也与 setState 函数异步有关,即不立刻修改 count 状态。
6、setState 接受函数参数
this.setState 可以接受一个函数参数。该函数有两参数:一个是当前的 state 值,第二个是当前的 props,该函数返回一个对象,这个对象代表想要对 this.state 的更改。
function increment(state, props){ return {count: state.count + 1};}this.setState(increment);
可以看到,此时计算新状态的值不在依赖于 this.state 而是依赖于参数 state。借助该方法就可以连续修改同一状态。
this.setState(increment);this.setState(increment);this.setState(increment);
上面代码调用三次 setState 的结果是 this.state.count 的值加 3。这是因为 React 会保证每次调用 increment 时,state 都已经合并了之前的状态修改结果。
注意:当使用对象做 setState 方法参数和使用函数做 setState 方法参数时,使用对象参数的 setState 方法会将状态还原。
this.setState(increment);this.setState(increment);this.setState({count: this.state.count + 1});this.setState(increment);
上面代码执行完 this.state.count 加 2 ,不是 4。
setState:这个API设计到底怎么样
- React —(setState 方法)
- react学习笔记之setState方法注意事项
- React源码分析5 — setState机制
- React学习-- React源码(4)setState机制
- React 之 setState
- React中setState回调
- 震惊! React中三个方法获取setState更新之后的state !其中一个竟用到Promise!
- React踩坑指南——setState不生效的解决方法
- react setState 的回调函数
- React的setState立即执行方案
- React总结1:异步更新的setState
- React总结8:setState()的参数
- React中setState回调函数
- React的异步更新的setState
- React中setState同步更新策略
- React中setState同步更新策略
- react 中setState状态没有“更新”
- React与Preact差异之 -- setState
- (10)数据挖掘算法之CART
- 导出csv文件数字会自动变科学计数法的解决方法
- 第一个Ruby程序,Hello Ruby
- RPGMaker MV 插件基础03:如何重写方法
- HDU
- React —(setState 方法)
- 嵌入式Linux入门12:应用层调试
- 线程--同步函数被static修饰锁是类名.class
- python操作Excel读写--使用xlrd
- 从ODX(Open diagnostic Data eXchange)谈车联网应用绕不开的底层网络“基建”
- Windows游戏开发(C++)
- LeetCode——111. Minimum Depth of Binary Tree
- 我的Ruby学习历程之初识数组
- 深入理解Java虚拟机——JVM的内存结构和内存分配策略