3 回答

TA貢獻1806條經驗 獲得超5個贊
如React文檔所述
通常,幾個組件需要反映相同的變化數據。我們建議將共享狀態提升到最接近的共同祖先。
對于React應用程序中發生的任何數據更改,應該只有一個“事實來源”。通常,首先將狀態添加到需要呈現的組件。然后,如果其他組件也需要它,則可以將其提升到最接近的共同祖先。與其嘗試在不同組件之間同步狀態,不如依靠自上而下的數據流。
與雙向綁定方法相比,解除狀態涉及編寫更多的“樣板”代碼,但這樣做的好處是,查找和隔離錯誤的工作量較小。由于任何狀態都“存在”于某個組件中,并且僅該一個組件即可更改它,因此大大減少了錯誤的表面積。此外,您可以實現任何自定義邏輯來拒絕或轉換用戶輸入。
因此,從本質上講,您還需要將樹狀結構提升到正在被兄弟姐妹組件使用的狀態。因此,您第selectedItems一個將狀態存儲為狀態的實現RightContainer是完全合理的,并且是一種很好的方法,因為父級不需要了解信息,并且這data是由的兩個child組件共享的,而這兩個組件RightContainer現在只有一個來源真相。
根據您的問題:
作為可行的替代方案,我想到了將_selected屬性添加到中的每個項目中state.right.data,MainContainer并將select回調向下傳遞到三個級別,以SelectableList處理in中的所有可能動作MainContainer
我不同意這是比第一種更好的方法,因為您MainContainer不需要知道selectedItems或處理程序的任何更新。MainContainer對這些州沒有做任何事情,只是將其傳承下去。
考慮到optimise on performance您自己談論實現a的問題shouldComponentUpdate,但是可以通過擴展組件來避免這種情況,該組件通過擴展React.PureComponent本質上實現了and shouldComponentUpdate的shallow比較來實現。stateprops
根據文檔:
如果您的React組件的render()函數在相同的道具和狀態下呈現相同的結果,則React.PureComponen在某些情況下可以使用t來提高性能。
但是,如果多個深度嵌套的組件正在使用同一數據,則使用redux并將該數據存儲在redux狀態是有意義的。這樣,整個應用程序就可以全局訪問它,并且可以在不直接相關的組件之間共享它。
例如考慮以下情況
const App = () => {
<Router>
<Route path="/" component={Home}/>
<Route path="/mypage" component={MyComp}/>
</Router>
}
現在,如果Home和MyComp都想訪問相同的數據。您可以通過通過renderprop 調用它們,將數據作為來自prop的prop 傳遞。但是,可以通過使用以下connect函數將這兩個組件都連接到Redux狀態來輕松實現
const mapStateToProps = (state) => {
return {
data: state.data
}
}
export connect(mapStateToProps)(Home);
和類似的MyComp。易于配置操作以更新相關信息
同樣,為您的應用程序配置Redux特別容易,您將能夠在單個化簡器中存儲與相同內容相關的數據。這樣,您還可以模塊化您的應用程序數據

TA貢獻1856條經驗 獲得超11個贊
通過使用Redux,您可以避免此類回調并在單個存儲中維護整個狀態-因此,使您的父組件連接組件-并使左右組件啞巴-只需將您從父組件獲得的道具傳遞給子組件-然后您在這種情況下,不必擔心回調。
添加回答
舉報