react setState解讀
總結(jié):
看似同步,實(shí)則異步。
setState(updater, callback)這個(gè)方法是用來告訴react組件數(shù)據(jù)有更新,有可能需要重新渲染。它是異步的,react通常會集齊一批需要更新的組件,然后一次性更新來保證渲染的性能,所以這就給我們埋了一個(gè)坑:
那就是在使用setState改變狀態(tài)之后,立刻通過this.state去拿最新的狀態(tài)往往是拿不到的。callback將會在state數(shù)據(jù)更新后且組件重新渲染完后執(zhí)行。
總結(jié) :
- setState 只在合成事件和鉤子函數(shù)中是“異步”的,在原生事件和 setTimeout 中都是同步的。
- setState的“異步”并不是說內(nèi)部由異步代碼實(shí)現(xiàn),其實(shí)本身執(zhí)行的過程和代碼都是同步的,只是合成事件和鉤子函數(shù)的調(diào)用順序在更新之前,導(dǎo)致在合成事件和鉤子函數(shù)中沒法立馬拿到更新后的值,形式了所謂的“異步”,當(dāng)然可以通過第二個(gè)參數(shù) setState(partialState, callback) 中的callback拿到更新后的結(jié)果。
- setState 的批量更新優(yōu)化也是建立在“異步”(合成事件、鉤子函數(shù))之上的,在原生事件和setTimeout 中不會批量更新,在“異步”中如果對同一個(gè)值進(jìn)行多次 setState , setState 的批量更新策略會對其進(jìn)行覆蓋,取最后一次的執(zhí)行,如果是同時(shí) setState 多個(gè)不同的值,在更新時(shí)會對其進(jìn)行合并批量更新。