2 回答

TA貢獻1847條經驗 獲得超7個贊
供以后參考:我設法在 React 源代碼中找到了新狀態偏離舊狀態的位置。
為此,我使用了 React Github 存儲庫的最新主分支(提交哈希e7b255341b059b4e2a109847395d0d0ba2633999 )。
免責聲明,這只是我的解釋,我主要是憑記憶。魔法發生在文件packages/react-reconciler/src/ReactUpdateQueue.new.js中,在函數getStateFromUpdate中。調用setState時,會創建更新對象 (update.tag = UpdateState) 并將其添加到更新隊列(用于異步行為)。該標記用于此函數的 switch 語句中以實現特定的更新邏輯。在案例 UpdateState 的底部,我們看到React 克隆了之前的狀態并將其與“partialState”合并,這是傳遞給setState調用的狀態對象。此克隆是使用以下方法完成的:
// Merge the partial state and the previous state. return Object.assign({}, prevState, partialState);
新狀態從此函數返回,而先前的狀態仍存儲在某處。它們現在可以用于以后的比較。作為旁注,這里也處理了 ForceUpdate,它只返回以前的狀態(然后根據相同的邏輯變成新狀態)。
關于我問題的第二部分,嵌套結構是如何處理的。鑒于這一新發現的知識,經過一番搜索后,我發現這個問題很好地回答了這個問題。

TA貢獻1869條經驗 獲得超4個贊
在使用類概念 for 的 React JS 中shouldComponentUpdate
,如果我們不覆蓋它,Component
將始終返回 true 并PureComponent
實現淺比較(淺比較通過檢查兩個值是否相等來工作,如果是基本類型,如字符串,數字和對象的情況它只是檢查) 對道具和狀態的引用,并在任何道具或狀態發生變化時返回 true 。
如果我們重寫 shouldComponentUpdate,我們將擁有以前的道具和以前的狀態。對象類組件中已經有商店。對于下一個道具和下一個狀態,我認為:
下一個道具將傳遞給組件。所以,它是新的。
下一個狀態在 function 上處理
setState
。它是從以前的狀態克隆而來的,并為此添加了新的更改。因此,前一個狀態的引用和下一個狀態的引用總是不同的。
添加回答
舉報