useState - Error: Too many re-renders. React limits the number of renders to prevent an infinite loop
useState - Error: Too many re-renders. React limits the number of renders to prevent an infinite loop
我遇到了这个无限循环错误。我想根据 count
的值更改 isDisabled
的状态。如果我想保持挂钩状态,我应该如何解决这个问题?
const TheGame = () => {
const [count, setCount] = useState(0);
const [isDisabled, setIsDisabled] = useState(false);
const onHitHandler = async () => {
let card = await fetchCard();
if (card[0].value === 'ACE')
setCount((prevCount) => prevCount + 11);
else if (card[0].value === 'JACK' || card[0].value === 'QUEEN') || card[0].value === 'KING')
setCount((prevCount) => prevCount + 10);
else
setCount((prevCount) => prevCount + Number(card[0].value));
};
if(count > 21)
setIsDisabled(true); // error occures here.
return(something);
};
试试这个:
useEffect(()=>{
if(count > 21) {
setIsDisabled(true);
}
}, [count])
不使用 useEffect,另一种方法是认识到这个变量不一定是内在状态,而是可以从内在状态“计算”出来的东西。
例如,您的代码可以是
const TheGame = () => {
const [count, setCount] = useState(0);
const onHitHandler = async () => {
let card = await fetchCard();
if (card[0].value === 'ACE')
setCount((prevCount) => prevCount + 11);
else if (card[0].value === 'JACK' || card[0].value === 'QUEEN') || card[0].value === 'KING')
setCount((prevCount) => prevCount + 10);
else
setCount((prevCount) => prevCount + Number(card[0].value));
};
const disabled = count > 21 ? true : false // or simply const disabled = count>21
return disabled ? <DisabledState/> : <NonDisabledState/>
};
此外,在前一种情况下它失败的原因是您不想在组件的正常“呈现”中使用“setState”类型的回调。这是因为任何时候使用 setState 回调,它都会重新渲染您的组件(以便可以在屏幕上绘制新状态!)
我遇到了这个无限循环错误。我想根据 count
的值更改 isDisabled
的状态。如果我想保持挂钩状态,我应该如何解决这个问题?
const TheGame = () => {
const [count, setCount] = useState(0);
const [isDisabled, setIsDisabled] = useState(false);
const onHitHandler = async () => {
let card = await fetchCard();
if (card[0].value === 'ACE')
setCount((prevCount) => prevCount + 11);
else if (card[0].value === 'JACK' || card[0].value === 'QUEEN') || card[0].value === 'KING')
setCount((prevCount) => prevCount + 10);
else
setCount((prevCount) => prevCount + Number(card[0].value));
};
if(count > 21)
setIsDisabled(true); // error occures here.
return(something);
};
试试这个:
useEffect(()=>{
if(count > 21) {
setIsDisabled(true);
}
}, [count])
不使用 useEffect,另一种方法是认识到这个变量不一定是内在状态,而是可以从内在状态“计算”出来的东西。
例如,您的代码可以是
const TheGame = () => {
const [count, setCount] = useState(0);
const onHitHandler = async () => {
let card = await fetchCard();
if (card[0].value === 'ACE')
setCount((prevCount) => prevCount + 11);
else if (card[0].value === 'JACK' || card[0].value === 'QUEEN') || card[0].value === 'KING')
setCount((prevCount) => prevCount + 10);
else
setCount((prevCount) => prevCount + Number(card[0].value));
};
const disabled = count > 21 ? true : false // or simply const disabled = count>21
return disabled ? <DisabledState/> : <NonDisabledState/>
};
此外,在前一种情况下它失败的原因是您不想在组件的正常“呈现”中使用“setState”类型的回调。这是因为任何时候使用 setState 回调,它都会重新渲染您的组件(以便可以在屏幕上绘制新状态!)