2 回答

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊
答案是 React 使用一組啟發(fā)式方法來確定它是否可以避免再次調(diào)用渲染函數(shù)。這些啟發(fā)式方法可能會(huì)在版本之間發(fā)生變化,并且不能保證在狀態(tài)相同時(shí)總是退出。React 提供的唯一保證是,如果狀態(tài)相同,它不會(huì)重新渲染子組件。
你的渲染函數(shù)應(yīng)該是純的。因此,它們運(yùn)行多少次并不重要。如果您在渲染函數(shù)中計(jì)算一些昂貴的東西并且擔(dān)心調(diào)用它而不是必要的,您可以將該計(jì)算包裝在useMemo
.
一般來說,React 中的“計(jì)數(shù)渲染”是沒有用的。React 何時(shí)調(diào)用您的函數(shù)取決于 React 本身,并且確切的時(shí)間將在版本之間不斷變化。這不是合同的一部分。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
這似乎是一種預(yù)期的行為。
來自React 文檔:
擺脫狀態(tài)更新
如果您將 State Hook 更新為與當(dāng)前狀態(tài)相同的值,React 將退出而不渲染子級(jí)或觸發(fā)效果。(React 使用
Object.is
比較算法。)請(qǐng)注意,React 可能仍需要在退出之前再次渲染該特定組件。這不應(yīng)該是一個(gè)問題,因?yàn)?React 不會(huì)不必要地“深入”到樹中。如果您在渲染時(shí)進(jìn)行昂貴的計(jì)算,您可以使用
useMemo
.
因此,React確實(shí)在第一個(gè)演示的第 4 步和第二個(gè)演示的第 3 步重新渲染了組件。因此,它執(zhí)行函數(shù)內(nèi)的所有代碼,并調(diào)用React.createElement()
組件的每個(gè)子組件。
但是,它不會(huì)渲染組件的任何后代,也不會(huì)觸發(fā)效果。
這僅適用于功能組件。對(duì)于純類組件,render
如果狀態(tài)未更改,則永遠(yuǎn)不會(huì)調(diào)用該方法。
我們無法避免重新運(yùn)行。記住這個(gè)函數(shù)memo()
也無濟(jì)于事,因?yàn)?a >它只檢查 props的變化,而不是狀態(tài)。所以我們只需要考慮這種情況。
這并不能回答 React 為什么以及何時(shí)運(yùn)行該函數(shù)但退出,以及何時(shí)它根本不運(yùn)行該函數(shù)的問題。如果您知道原因,請(qǐng)?zhí)砑幽拇鸢浮?/p>
添加回答
舉報(bào)