參考文章https://juejin.im/post/5ac1aaad6fb9a028d444bb87
this.setState({val:this.state.val + 1})
console.log(this.state.val); //0
this.setState({val:this.state.val + 1})
console.log(this.state.val);//0
setTimeout(_=>{
console.log(this.state.val) //1
this.setState({val:this.state.val + 1})
console.log(this.state.val);//2
this.setState({val:this.state.val + 1})
console.log(this.state.val);//3
})
//setState只有在合成事件和鉤子函數(shù)中是異步的,在原生事件和setTimeout中都是同步的
//setState的異步并不是說(shuō)內(nèi)部由異步代碼實(shí)現(xiàn),其實(shí)本身執(zhí)行的過(guò)程和代碼都是同步的,只是合成事件和鉤子函數(shù)的調(diào)用順序在更新之前,導(dǎo)致無(wú)法立馬拿到更新后的值,
//setState 的批量更新優(yōu)化也是建立在“異步”(合成事件降盹、鉤子函數(shù))之上的黄痪,在原生事件和setTimeout 中不會(huì)批量更新竞滓,在“異步”中如果對(duì)同一個(gè)值進(jìn)行多次 setState , setState 的批量更新策略會(huì)對(duì)其進(jìn)行覆蓋,取最后一次的執(zhí)行,如果是同時(shí) setState 多個(gè)不同的值,在更新時(shí)會(huì)對(duì)其進(jìn)行合并批量更新淆院。