[英]How to delay evaluation of JSX passed as props children to another component?
反應16.13
。 我正在編寫一個Loader
組件來處理不同的故障狀態,並將“成功”的內容作為一個孩子傳遞,如下所示:
<Loader
isLoading={loading}
isError={error}>
<div>{this.props.loadedContentFromRedux}</div>
</Loader>
Loader 組件非常簡單:
class Loader extends Component {
render() {
return this.props.isLoading ? <Spinner /> :
this.props.isError ? <Error /> :
this.props.children
}
}
據我了解,因為我將loadedContentFromRedux
道具直接傳遞給孩子,所以在作為孩子傳遞給Loader
之前對其進行評估,因此在調用Loader
的渲染方法之前對其進行評估。
有沒有辦法可以延遲評估以防止這種情況發生,或者我需要防止這種情況發生? 或者也許克隆孩子並以這種方式傳遞道具?
嘗試這個:
const loadedContent = () => <div>{this.props.loadedContentFromRedux}</div>
<Loader
isLoading={loading}
isError={error}
loadedContent={loadedContent}
/>
將 Loader 組件更改為:
class Loader extends Component {
render() {
return this.props.isLoading ? <Spinner /> :
this.props.isError ? <Error /> :
this.props.loadedContent()
}
}
通過這樣做,您 r 在傳遞時不會執行加載的內容,因此不會發生this.props.loadedContentFromRedux
執行。 它將在 render 方法中的Loader
組件中執行。
我能夠在此基礎上構建並稍微更改語法,這樣看起來更容易,並且小時候通過 function。 它需要在Loader
渲染中進行類型檢查,如下所示:
<Loader
isLoading={loading}
isError={error}>
{() => <div>{this.props.loadedContentFromRedux}</div>}
</Loader>
然后防范 function 類型如下 - 這是因為 JSX 有時會被過早評估:
class Loader extends Component {
render() {
return this.props.isLoading ? <Spinner /> :
this.props.isError ? <Error /> :
typeof this.props.children==='function' ? this.props.children() :
this.props.children
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.