P粉5338986942023-08-19 15:04:37
所以我認為發生這種情況的原因是,在ConditionalRenderComponent
元件中,子元素被當作屬性傳遞給它(就像函數的參數一樣)。 JSX表達式被當作函數的參數來評估。
這意味著即使condition
為false,children
在傳遞給ConditionalRenderComponent
函數之前仍然會被評估。
你把一個PlayStation
(在你的左手)和數學試捲成績
(在你的右手)給了一個孩子,並說如果他/她的分數超過90 /100,他/她就會得到PlayStation。
由於孩子已經可以看到你左手中的PlayStation(將children
作為JSX表達式傳遞),他/她在檢查條件之前就已經開始使用了。
現在,如果你握緊你的拳頭,相當於將children
作為函數傳遞,他/她在檢查你右手中的條件是否為真之前無法評估左手中的內容。
我們透過使用函數作為子元素來修改我們的自訂元件,而不是直接在元件中渲染children
。這樣,您可以確保只有在condition
為真時才會評估children
。
function ConditionalRenderComponent({ condition, children }) { return ( <div> {condition && children()} </div> ); }
<ConditionalRenderComponent condition={isLoggedIn}> {() => ( <div> <p>你好,{userData.username}!</p> <p>你的电子邮件:{userData.email}</p> </div> )} </ConditionalRenderComponent>
P粉5433443812023-08-19 13:02:01
我不建議為條件渲染建立一個元件,但如果你想這樣做,你可以使用渲染屬性模式,這樣只有在條件為真時才呼叫函數。這樣可以防止表達式立即被評估。
function If({ condition, render }) { if (!condition) return null; return render(); } export default function App() { const [state, setState] = useState(null); useEffect(() => { wait(1000).then(() => { setState({ hello: "world" }); }); }, []); return ( <div className="App"> <h1>Hello CodeSandbox</h1> <If condition={Boolean(state)} render={() => <p>{state.hello}</p>} /> </div> ); }