react中的setState特点

  1. 是异步操作函数;
  2. 组件在还没有渲染之前, this.setState 还没有被调用;
  3. 批量执行 State 转变时让 DOM 渲染更快(相对比一个一个的setState的来的快)

例如:{count:0}//初始化count
this.setState({count:1});
console.log(this.state.count);

setState函数并不会阻塞等待状态更新完毕。所以,打印出来的并不是count=1,而还是count=0。

很多时候,我们需要想要的state状态更新完成后再进行某些操作

实现方法:

  • setState支持回调函数
  • ES7的Async/Await实现异步转同步

1. setState支持回调函数

第一个参数是我们要设置的state,第二个参数是在状态更新完毕后的回调操作 (一般有时候无效果);

this.setState({count:1},()=>{
console.log(this.state.count)//输出count=1
});

2. ES7的Async/Await实现异步转同步

var delay = function (time) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve();
}, time);
})
}; var start = async function () {
console.log('a');
await delay();
console.log('b');
}; start();//先输出a,稍等2秒后,输出了b

同样在react中的应用:

Promise来封装setState:
setStateAsync(state) {
return new Promise((resolve) => {
this.setState(state, resolve)
});
}
async componentDidMount() {
await this.setStateAsync({count: 1});
console.log(this.state.count);//输出count=1
}
  1. async 表示这是一个async函数,await只能用在这个函数里面。
  2. await 表示在这里等待promise返回结果了,再继续执行。
  3. await 后面跟着的应该是一个promise对象
class Example extends React.Component {
constructor() {
super();
this.state = {
val: 0
};
} componentDidMount() {
this.setState({val: this.state.val + 1});
console.log(this.state.val); // 第 1 次 log->0 this.setState({val: this.state.val + 1});
console.log(this.state.val); // 第 2 次 log->0 setTimeout(() => {
this.setState({val: this.state.val + 1});
console.log(this.state.val); // 第 3 次 log->2 this.setState({val: this.state.val + 1});
console.log(this.state.val); // 第 4 次 log->3
}, 0);
} render() {
return null;
}
};

 

最新文章

  1. 在AngularJS中同一个页面配置一个或者多个ng-app
  2. oracle xmltype导入并解析Excel数据 (三)解析Excel数据
  3. C++自问自答
  4. 使用php脚本查看已开启的扩展
  5. 【hihoCoder】1041. 国庆出游
  6. Codeforces7C 扩展欧几里得
  7. Eclipse jar打包
  8. ThinkPHP 中实现 Rewrite 模式
  9. run fsck manually
  10. 立体视觉-opencv中立体匹配相关代码
  11. Sencha Touch 的基础知识
  12. HTML 基础 1
  13. 作为一个新人,如何学习嵌入式Linux?
  14. JAVA异常处理、常用类、反射、集合
  15. python selenium 元素定位(三)
  16. 201521123099 《Java程序设计》第八周学习总结
  17. shell命令总结一
  18. SUN平台服务器光纤共享存储互斥失败如何恢复数据?
  19. Django的认证系统
  20. 事务理解及Spring中的事务

热门文章

  1. mac卸载jdk
  2. CSS 处理溢出强行换行
  3. cmd命令行的FTP使用
  4. 关于option标签的selected属性
  5. 在HTML标签元素中,绑定JS函数
  6. 前端必须掌握的 nginx 技能(1)
  7. C#程序自动安装数字证书
  8. 自定义配置节点configSections的使用
  9. maven setting.xml文件配置详情
  10. 淘淘相关工具类【json,httpClient,id,FTP,exception,cookie(包括共享cookie的设置等)】