2 回答
TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
首先,首先,
我希望將來能夠從應(yīng)用程序內(nèi)創(chuàng)建多個(gè) SomeComponent 。
在使用 React 時(shí),這(至少是你這樣做的方式)是不可能的或根本不應(yīng)該做的。您不能在另一個(gè)組件內(nèi)創(chuàng)建一個(gè)組件。
目前,您陷入無限循環(huán)的原因useEffect可能有多種。可能它沒有位于最高范圍,但我的猜測是發(fā)生以下情況:
genId()被調(diào)用,狀態(tài)被更新,重新渲染被初始化(因?yàn)闋顟B(tài)更新),并const SomeComponent = () => {...}再次初始化,從而useEffect再次激活。
要解決這個(gè)問題,首先要從內(nèi)部創(chuàng)建的事物中刪除<SomeComponent /><App />它們,它們應(yīng)該完全分開。其次,將該genId函數(shù)作為prop傳遞,并將其添加到useEffect依賴項(xiàng)列表中,因?yàn)槟枰?/p>
這將是一個(gè)很好的開始,因?yàn)楝F(xiàn)在代碼在語義上和規(guī)則上都是正確的。
const SomeComponent = ({ genId }) => {
? const [ componentId, setComponentId ] = React.useState(null);
? ??
? React.useEffect(() => {
? ? let generatedId = genId();
? ? setComponentId(generatedId);
? ? console.log(`generated '${generatedId}'`)
? }, [genId]);
? ??
? return <div>nothing works</div>
}
const App = () => {
? const [ idCounter, setIdCounter ] = React.useState(0);
??
??
? const genId = () => {
? ? setIdCounter( id => id + 1 );
? ? return `ID-${idCounter}`;
? }
??
??
? return <SomeComponent genId={genId} />
};
TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
我不會回答這個(gè)問題,只是指出子組件有一些缺點(diǎn)。你的子組件幾乎不可能進(jìn)行單元測試。也許您可以將其移至頂級組件并接受generatedId作為道具
const SomeComponent = ({generatedId}) => {
const [ componentId, setComponentId ] = React.useState(null);
React.useEffect(() => {
setComponentId( id => generatedId );
console.log(`generated '${generatedId}'`)
}, []);
return <div>nothing works</div>
}
const App = () => {
const [ idCounter, setIdCounter ] = React.useState(0);
const genId = () => {
setIdCounter( id => id + 1 );
return `ID-${idCounter}`;
}
return <SomeComponent generatedId={genId()}/>
};
添加回答
舉報(bào)
