Javascript `setNum(()=>;num+;+;)`不工作,但`setNum(()=>;num+;1)`

Javascript `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

我正在练习使用钩子和上下文做出反应,正在开发一个简单的测验应用程序。答案正确时,分数应增加到1

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