[英]Behavior of a React component passed as prop
在大多數情況下,您將組件作為children
組件傳遞到另一個組件。 但是我已經看到(例如,在幾個UI庫中)組件也可以使用標准命名的props
進行傳遞。 我也嘗試過,但是遇到了一些限制,我在文檔中找不到任何有關它的信息(實際上應該如何工作)。
這是我要實現的目標:
const App = ({ status, data }) => {
return <Layout
sidebar={<CustomSidebar />}
toolbar={<CustomToolbar />}
content={status == 'loading' ? <LoadingBar status={status} /> : <Content data={data} />}
/>
};
const LoadingBar = ({ status }) => <span>Loading... (current status: {status})</span>
正如您在這里看到的,僅使用children
是不夠的,我想傳遞多個組件,將其放置在正確的位置是Layout'
的工作。 顯然,我這樣做的原因是我想重新使用Layout
。
但這是行不通的。 LoadingBar
正確顯示,但是一旦加載數據( status
從loading
更改為done
), LoadingBar
正確打印更改后的狀態( done
), 但永遠不會被Content
組件替換。 實際上,它永遠不應該done
打印,而應該消失。
我做了一些實驗,並且只有當我將完全靜態的組件作為props
傳遞時(即輸入沒有改變),它才起作用。 這工作:
const App = ({ status, data }) => {
return <Layout
sidebar={<CustomSidebar />}
toolbar={<CustomToolbar />}
content={<ContentWrapper />}
/>
};
const mapStateToProps = (state, props) => { ... };
const ContentWrapper = connect(mapStateToProps)(({ status, data }) => {
return status == 'loading' ? <LoadingBar status={status} /> : <Content data={data} />;
});
如您所見, ContentWrapper
組件已連接到redux
存儲,因此它完全在父組件上獨立更新。
有沒有辦法使最初的例子起作用? 還是我做錯了什么? 這種方法得到認可嗎?
編輯:整個事情是我的代碼中的錯誤。 由於此錯誤的整體怪異行為, status
從未改變為done
並且我沒想到要進行實際測試。 看下面我的回答。
在最初的示例中,您僅傳遞了<LoadingBar>
或<Content>
。 如何實現所需的目標可能會有很多變化。 一種選擇是將這兩個元素都作為單獨的道具傳遞,並將status
作為道具傳遞,並讓<Layout>
決定如何處理它們。 或者,您可以根據需要執行以下操作:
content={function (status, data) {
return status == 'loading' ? <LoadingBar /> : <Content data={data} />;
}}
您的代碼似乎正確。 這不是國家問題嗎?
content={status === 'loading' ? <LoadingBar /> : <Content data={data} />}
狀態更改后,您的LoadingBar將消失。 然后,將100%替換為Content,但使用一個空的數據道具。 我想說的是,數據道具沒有在正確的時間填充? 如果在加載欄消失時控制台退出數據道具,會發生什么情況?
是否以適當的方式定義了所有狀態?
好的,顯然問題出在我的代碼中,React沒有任何問題,它的運行完全符合您的期望。 我在jsfiddle上實現了整個示例,以在單獨的環境中對其進行測試,因此您可以檢出它: http : //jsfiddle.net/9u4nmcrn/9/
它像一種魅力。
簡要說明一下:在我的真實應用中, status
不是字符串,而是一個具有兩個屬性的對象: isLoading
(布爾值指示請求是否正在進行中)和done
(布爾值指示請求是否成功完成)。 問題是,我在測試done
我的外部組件和isLoading
在LoadingBar
(它隱藏自身,一旦isLoading
翻轉為false)。 對於一些其他原因布爾done
從來沒有翻到true
。 因此結果是, LoadingBar
消失了,但是它從未被Content
取代,因為done
仍然是錯誤的。 不幸的是,我從一開始就堅信React一定有問題,所以我什至沒有做最基本的調試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.