ReactDOM.render
就像陣營應用的主要方法。所有反應相關的概念,如組件,狀態和上下文都從這裏開始。您可以在同一頁面上多次調用ReactDOM.render
,使用相同的容器DOM節點或不同的容器DOM節點。如果容器相同,則會對其執行更新,並且只根據需要更改DOM以反映最新的React元素。但是,如果容器節點不同,它將創建兩個不同的React根,並且它們完全相互獨立。這兩個React根目錄之間沒有共享狀態或上下文,就像在同一頁面上運行兩個不同的React應用程序一樣。
此外,在將根元素與ReactDOM.render
渲染到容器節點後,所有其他後代元素將由React渲染到其中,並且我們沒有任何控制權來更改它們呈現的位置(這將在未來發生變化) 。
所以你的情況,如果要呈現不同的容器節點這兩種成分,你將不能夠有一個應用程序組件,它保持了共享狀態或者事件處理。但是,你可以創建兩個不同的React根,並通過道具在它們之間共享對象和方法。
const data = {/*...*/}
ReactDOM.render(<Component data={data} />,
document.getElementById('component'));
ReactDOM.render(<AnotherComponent data={data} />,
document.getElementById('anotherComponent'));
但是,如果您想在某些時候更改這些道具,您必須手動重新渲染根組件。舉個例子,如果你有一個counter
變量,它在每一個更新第二你有每個新值重新呈現你的根。
let couter = 0
setInterval(function(){
counter++
ReactDOM.render(<Component data={data} />,
document.getElementById('component'));
ReactDOM.render(<AnotherComponent data={data} />,
document.getElementById('anotherComponent'));
}, 1000)
另一個不錯的選擇是使用類似Redux的狀態管理庫。您可以擁有一個store
並在兩個根之間共享它。如果你需要在兩個根之間分享一個非常複雜的狀態,我強烈推薦這種方法。
const store = createStore(/* ... */)
// ...
ReactDOM.render(
<Provider store={store}>
<Component />
</Provider>,
document.getElementById('component')
);
ReactDOM.render(
<Provider store={store}>
<AnotherComponent />
</Provider>,
document.getElementById('anotherComponent')
);
當您使用終極版,連接您的Component
和AnotherComponent
到store
與connect
高階組件。在引擎蓋下,這將subscribe您的組件到store
更改並重新組件的狀態時使用組件的forceUpdate
方法更改。因此,只要您通過向商店分派操作來更改狀態,您就不必手動調用ReactDOM.render
方法。
這是一個夢幻般的詳細的解答,我完全開明。非常感謝:) PS:只是一個問題,Redux會在更新狀態時自動運行ReactDOM.render方法嗎? – pmqa
@pmqa我很高興它幫助你。我更新了有關Redux方法如何工作的更多詳細信息。 –
太棒了。 Redux方法看起來就是這樣。再次感謝Tharaka。 – pmqa