2 回答

TA貢獻1872條經驗 獲得超4個贊
首先,首先,
我希望將來能夠從應用程序內創建多個 SomeComponent 。
在使用 React 時,這(至少是你這樣做的方式)是不可能的或根本不應該做的。您不能在另一個組件內創建一個組件。
目前,您陷入無限循環的原因useEffect
可能有多種??赡芩鼪]有位于最高范圍,但我的猜測是發生以下情況:
genId()
被調用,狀態被更新,重新渲染被初始化(因為狀態更新),并const SomeComponent = () => {...}
再次初始化,從而useEffect
再次激活。
要解決這個問題,首先要從內部創建的事物中刪除<SomeComponent />
<App />
它們,它們應該完全分開。其次,將該genId
函數作為prop傳遞,并將其添加到useEffect
依賴項列表中,因為您需要它。
這將是一個很好的開始,因為現在代碼在語義上和規則上都是正確的。
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條經驗 獲得超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()}/>
};
添加回答
舉報