2 回答

TA貢獻1872條經(jīng)驗 獲得超4個贊
首先,首先,
我希望將來能夠從應用程序內(nèi)創(chuàng)建多個 SomeComponent 。
在使用 React 時,這(至少是你這樣做的方式)是不可能的或根本不應該做的。您不能在另一個組件內(nèi)創(chuàng)建一個組件。
目前,您陷入無限循環(huán)的原因useEffect
可能有多種??赡芩鼪]有位于最高范圍,但我的猜測是發(fā)生以下情況:
genId()
被調(diào)用,狀態(tài)被更新,重新渲染被初始化(因為狀態(tài)更新),并const SomeComponent = () => {...}
再次初始化,從而useEffect
再次激活。
要解決這個問題,首先要從內(nèi)部創(chuàng)建的事物中刪除<SomeComponent />
<App />
它們,它們應該完全分開。其次,將該genId
函數(shù)作為prop傳遞,并將其添加到useEffect
依賴項列表中,因為您需要它。
這將是一個很好的開始,因為現(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貢獻1818條經(jīng)驗 獲得超11個贊
我不會回答這個問題,只是指出子組件有一些缺點。你的子組件幾乎不可能進行單元測試。也許您可以將其移至頂級組件并接受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()}/>
};
添加回答
舉報