react中的setState特色:react
例如:{count:0}//初始化count this.setState({count:1}); console.log(this.state.count);
setState函数并不会阻塞等待状态更新完毕。因此,打印出来的并非count=1,而仍是count=0。promise
不少时候,咱们须要想要的state状态更新完成后再进行某些操做。此时,咱们能够选择在componentWillUpdate生命周期或者componentDidUpdate生命周期的回调函数去执行咱们的操做。虽然也能够达到预期效果,可是这样作不是最佳方法,代码变得破碎,可读性也很差。异步
所以,此时咱们就须要保证setState的同步更新。async
第一个参数是咱们要设置的state,第二个参数是在状态更新完毕后的回调操做函数
this.setState({count:1},()=>{ console.log(this.state.count)//输出count=1 });
var delay = function (time) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(); }, time); }) }; var start = async function () { console.log('a'); await delay(2000); console.log('b'); }; start();//先输出a,稍等2秒后,输出了b
一样在react中的应用:this
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 }
附录:spa
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; } };