我对React和JS还很陌生,只是探索语言的本质.

我试图比较使用++操作符(并通过counter + 1的惯用方式)更新状态变量"counter"的差异.

我在以下片段中得到的错误是:

function App() {
  const [counter, setCounter] = useState(0);

  const incrementCounter = () => {
    setCounter(++counter);
  };

  console.log(counter);

return (
    <>
  <button onClick={incrementCounter}>Increase </button>
    </>
App.jsx?t=1714542208954:31 Uncaught TypeError: Assignment to constant variable.
    at incrementCounter (App.jsx?t=1714542208954:31:18)
    at HTMLUnknownElement.callCallback2 (react-dom_client.js?v=38cf15c3:3672:22)
    at Object.invokeGuardedCallbackDev (react-dom_client.js?v=38cf15c3:3697:24)
    at invokeGuardedCallback (react-dom_client.js?v=38cf15c3:3731:39)
    at invokeGuardedCallbackAndCatchFirstError (react-dom_client.js?v=38cf15c3:3734:33)
    at executeDispatch (react-dom_client.js?v=38cf15c3:7014:11)
    at processDispatchQueueItemsInOrder (react-dom_client.js?v=38cf15c3:7034:15)
    at processDispatchQueue (react-dom_client.js?v=38cf15c3:7043:13)
    at dispatchEventsForPlugins (react-dom_client.js?v=38cf15c3:7051:11)
    at react-dom_client.js?v=38cf15c3:7175:20

注 : I get the error after I click on Increase button

当我try 使用counter + 1调用setState函数(setCounter)时,错误就会消失,我无法理解原因.

我知道前/后修复操作符不适合更新react 状态,我想知道为什么是这种情况.

任何见解都将不胜感激.

推荐答案

这是基本的JavaScript,counter状态被声明为const,因此无法重新分配.

const [counter, setCounter] = useState(0); // <-- const

const incrementCounter = () => {
  setCounter(++counter); // <-- ++counter is a reassignment
};

考虑以下代码:

const foo = 0;
foo++; // error, can't be reassigned!

counter++counter = counter + 1的同义词,由于counter无法重新分配,因此counter = counter + 1失败.预/后增量将向当前值加一,并将该值赋回变量.

如果您需要在React中增加计数状态,则惯用方法是使用功能状态更新并将一添加到之前的状态值中.

const [counter, setCounter] = useState(0);

const incrementCounter = () => {
  setCounter(counter => counter + 1);
};

使用setCounter(counter + 1)的工作原理类似,因为您不会重新分配或变异counter状态,而是简单地将counter状态更新为result,将1添加到其值.

Javascript相关问答推荐

即使设置了父级的最大高度,固定位置的分区内容也不会滚动?

React redux状态未在React-Router库中呈现

如何编辑代码FlipDown.js倒计时?

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

使用JavaScript在ionic Web应用程序中更新.pane和.view的背景 colored颜色

materialized - activeIndex返回-1

我开始使用/url?q=使用Cheerio

WebGL 2.0无符号整数输入变量

并不是所有的iframe都被更换

如何解决useState错误—setSelect Image不是函数''

您能在卸载程序(QtInsteller框架)上添加WizardPage吗?

对路由DOM嵌套路由作出react

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

如何使用JS创建一个明暗功能按钮?

打字脚本中方括号符号属性访问和拾取实用程序的区别

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

在GraphQL解析器中修改上下文值

在JavaScript中将Base64转换为JSON

如何在Reaction中清除输入字段