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; } };