[英]Will JSX conditional rendering out of an object code split?
對象代碼的條件渲染是否會按預期拆分和延遲加載? 這是我正在談論的一個簡短示例。
const Component1 = lazy(() => import('some path'));
const Component2 = lazy(() => import('some path'));
const Component3 = lazy(() => import('some path'));
render () {
const { selectionIndex } = this.state;
<Suspense fallback={<div>Loading...</div>}>
{{
one: <Component1 />,
two: <Component2 />,
three: <Component3 />,
}[selectionIndex]}
</Suspense>
}
我想知道是否所有三個組件都會在渲染時加載,或者只是由 selectionIndex 選擇的一個。 我正在嘗試使用它來根據狀態設置的菜單有條件地選擇要顯示的內容,但我不想一次加載所有內容。
它們不會一次全部渲染。 你可以自己試驗,把console.log
放在組件里面很容易找到。
React for web 由兩個庫組成,“react”和“react-dom”。 “react”負責將您的邏輯意圖封裝到聲明性數據結構中,而“react-dom”則使用這些數據結構並處理工作的實際“渲染”部分。
JSX 元素創建語法<Component {…props} />
轉換為普通 JS 作為對React.createElement(Component, props)
的 API 調用。 這個 API 調用的返回值實際上只是一個具有某種形狀的普通對象,大致如下所示:
{
type: Component,
props: props
}
這就是前面提到的“聲明式數據結構”。 您可以在控制台中檢查它。
可以看到,調用React.createElement
只是返回這樣的數據結構,不會直接調用.render()
方法或函數組件的函數體。 數據結構被提交到“react-dom”庫以最終“渲染”。
因此,您的示例代碼僅創建這些數據結構,但不會呈現相關組件。
似乎它基於 selectionIndex 有條件地加載。 所有其他組件不會立即加載。
PS:如果您覺得哪個將首先加載,只需在該組件中放置一個控制台日志並輕松調試
有條件地加載演示鏈接- 如果您打開此鏈接,則最初根據 selectionIndex 值為“一”加載組件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.