为什么不能将 useState 钩子的调度函数直接传递给 onClick 处理程序?

Why can't the dispatch function of a useState hook be passed directly into an onClick handler?

const Counter = () => {
  const [count, setCount] = useState(0);
  // return <button onClick={setCount(count + 1)}>{count}</button>;
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
};

我知道注释掉的行会导致无限循环,但我想知道为什么会这样。 setCount 调度函数不是只在点击时调用吗?

这是因为 JSX 中 {} 中的表达式被 求值,然后它的结果被用在 {} 所在的地方——在这种情况下,作为onClick 属性 的值。所以 onClick={setCount(count + 1)} 评估 setCount(count + 1)(调用函数,这将设置状态)然后将结果值用于 onClick。由于调用它会设置状态,这会导致 re-rendering,它会无休止地重复。

您的其他版本在评估 JSX 时创建一个函数而不调用它,这就是它起作用的原因。

当你这样做时:

onClick={setCount(count + 1)}

您正在渲染期间调用该方法。

我没有看到无限循环,但您正在为每个渲染调用 setCount 导致重新渲染。