Javascript `setNum(()=>;num+;+;)`不工作,但`setNum(()=>;num+;1)`
我正在练习使用钩子和上下文做出反应,正在开发一个简单的测验应用程序。答案正确时,分数应增加到1Javascript `setNum(()=>;num+;+;)`不工作,但`setNum(()=>;num+;1)`,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我正在练习使用钩子和上下文做出反应,正在开发一个简单的测验应用程序。答案正确时,分数应增加到1 const { qa, questionNumber } = useContext(GlobalContext); const [score, setScore] = useState(0); const answerOnClick = (e) => { const correct = qa[questionNumber].correct_answer === e ? true : fal
const { qa, questionNumber } = useContext(GlobalContext);
const [score, setScore] = useState(0);
const answerOnClick = (e) => {
const correct = qa[questionNumber].correct_answer === e ? true : false;
if (correct) {
setScore(() => score++);
}
};
但是我在第setScore(()=>score++)行上得到了这个错误代码>:
TypeError:分配给常量变量
我还尝试了if(correct){score++;setScore(()=>score);}
和setScore(()=>+++score)
,但仍然不起作用
但是当我尝试setScore(()=>score+1)代码>,现在它递增强>
我了解到,是一个有效的JS操作符。score++
和score+1
不相等吗?为什么score
将其视为常量变量?它是可变的,对吗?我还是一个新手开发人员。有人能解释一下这里发生了什么吗?谢谢。当你做score++
时,你会改变状态。您不应该改变React中的状态,因为setNum是异步的
将setState()视为更新组件的请求,而不是即时命令。为了更好地感知性能,React可能会延迟它,然后在一次过程中更新多个组件。React不保证立即应用状态更改
执行score++
操作时,可以改变状态。您不应该改变React中的状态,因为setNum是异步的
将setState()视为更新组件的请求,而不是即时命令。为了更好地感知性能,React可能会延迟它,然后在一次过程中更新多个组件。React不保证立即应用状态更改
问题是,score
被定义为常量。这意味着不应重新分配is。使用score++
时,您将其重新分配如下score=score+1
但作为一种简写。JavaScript解释器不喜欢重新分配一个定义为常量的变量。因此,您得到了错误
useState
钩子提供了一个更新函数(在您的情况下是setScore
),您应该使用它来更新状态。您没有直接更改分数的值。您告诉react在下一次渲染时使用更高的值初始化分数。将再次调用components函数,并使用新的声明score
,这次使用更高的值。正如您正确指出的,setScore(()=>score+1)
起作用,但是,setScore(score+1)
也应该起作用。问题是,score
被定义为常量。这意味着不应重新分配is。使用score++
时,您将其重新分配如下score=score+1
但作为一种简写。JavaScript解释器不喜欢重新分配一个定义为常量的变量。因此,您得到了错误
useState
钩子提供了一个更新函数(在您的情况下是setScore
),您应该使用它来更新状态。您没有直接更改分数的值。您告诉react在下一次渲染时使用更高的值初始化分数。将再次调用components函数,并使用新的声明score
,这次使用更高的值。正如您正确指出的那样,setScore(()=>score+1)
起作用,但是,setScore(score+1)
也应该起作用。score++/+score
会改变状态。根据以前的状态更新状态的最佳方式如下:
setScore((prevScore) => prevScore + 1);
score++/++score
会使状态发生变异。根据以前的状态更新状态的最佳方式如下:
setScore((prevScore) => prevScore + 1);
这回答了你的问题吗?额外的阅读可能会有所帮助:我刚刚回忆起,score++
相当于score+=1
,而不是score+1
,并且score
不应该被重新分配。感谢您提供的有用链接,@EmileBergeron。这是否回答了您的问题?额外的阅读可能会有所帮助:我刚刚回忆起,score++
相当于score+=1
,而不是score+1
,并且score
不应该被重新分配。感谢您提供的有用链接,@EmileBergeron。虽然我们确实不应该改变这种状态,但OP遇到的并不是这种情况。他只是试图分配一个常量
值,这会抛出一个类型错误
。虽然我们不应该改变状态,但这不是OP遇到的问题。他只是试图分配一个const
值,这会抛出一个TypeError
。