setState什么時(shí)候是同步的碍遍,什么時(shí)候是異步的
setState的原理:
在React中捻勉,如果是由React引發(fā)的事件處理(比如通過onClick引發(fā)的事件處理)豁辉,調(diào)用setState不會同步更新this.state庶橱,除此之外的setState調(diào)用會同步執(zhí)行this.state夷恍。所謂“除此之外”,指的是繞過React通過addEventListener直接添加的事件處理函數(shù)棉安,還有通過setTimeout/setInterval產(chǎn)生的異步調(diào)用底扳。
原因:在React的setState函數(shù)實(shí)現(xiàn)中,會根據(jù)一個(gè)變量isBatchingUpdates判斷是直接更新this.state還是放到隊(duì)列中回頭再說贡耽,而isBatchingUpdates默認(rèn)是false衷模,也就表示setState會同步更新this.state,但是菇爪,有一個(gè)函數(shù)batchedUpdates算芯,這個(gè)函數(shù)會把isBatchingUpdates修改為true柒昏,而當(dāng)React在調(diào)用事件處理函數(shù)之前就會調(diào)用這個(gè)batchedUpdates凳宙,造成的后果,就是由React控制的事件處理過程setState不會同步更新this.state职祷。
異步處理的時(shí)候
https://reactjs.org/docs/faq-state.html#when-is-setstate-asynchronous
react 事件機(jī)制
- 當(dāng)用戶在為onClick添加函數(shù)時(shí)氏涩,React并沒有將Click時(shí)間綁定在DOM上面。
- 而是在document處監(jiān)聽所有支持的事件有梆,當(dāng)事件發(fā)生并冒泡至document處時(shí)是尖,React將事件內(nèi)容封裝交給中間層SyntheticEvent(負(fù)責(zé)所有事件合成)
- 所以當(dāng)事件觸發(fā)的時(shí)候,對使用統(tǒng)一的分發(fā)函數(shù)dispatchEvent將指定函數(shù)執(zhí)行泥耀。
react 與 vue的對比
react
1 函數(shù)式思想饺汹,all in js ,jsx語法,js操控css
2 單項(xiàng)數(shù)據(jù)流
3 setState重新渲染
4 每當(dāng)應(yīng)用的狀態(tài)被改變時(shí)痰催,全部子組件都會重新渲染兜辞。當(dāng)然,這可以通過shouldComponentUpdate這個(gè)生命周期方法來進(jìn)行控制夸溶,如果為true繼續(xù)渲染逸吵、false不渲染,但Vue將此視為默認(rèn)的優(yōu)化缝裁。
vue
1 響應(yīng)式思想扫皱,也就是基于數(shù)據(jù)可變的。把html、js韩脑、css氢妈、組合到一起,也可以通過標(biāo)簽引擎組合到一個(gè)頁面中
2 雙向綁定段多,每一個(gè)屬性都需要建立watch監(jiān)聽(頁面不用允懂,涉及到組件更新的話需要)
3 Vue宣稱可以更快地計(jì)算出Virtual DOM的差異,這是由于它在渲染過程中衩匣,會跟蹤每一個(gè)組件的依賴關(guān)系蕾总,不需要重新渲染整個(gè)組件樹