useState 的 setter 是否保证相同?

Ami*_*mit 5 javascript reactjs react-hooks

假设我想创建经常需要的useInputState钩子:

function useInputState(initialValue) {
  const [value, setValue] = useState(initialValue);
  const onChange = useCallback(
    e => setValue(e.target.value), 
    [ /* ??? */ ]
  );
  return { value, onChange };
}
Run Code Online (Sandbox Code Playgroud)

我需要将setValuesetter 函数添加到回调的依赖项中吗?我们可以指望二传手始终保持不变吗?当我尝试时,这似乎有效,但这是好的做法吗?或者我们应该假设回调闭包中的任何内容都可以更改并影响其实现?

(我可以想到更多最终提出同样问题的例子)

Est*_*ask 1

是的,useState状态设置器是相同的功能;即使它不会,也会期望更新状态。它应该像问题所示那样使用。

useReducer 文档中更好地解释了常见用法:

useReducer 还可以让您优化触发深度更新的组件的性能,因为您可以向下传递调度而不是回调。

在内部useState使用useReducer

对调用范围的关注useState仅适用于useState在使用它的回调范围内保持不变的状态值,例如this Problem。如果应使用当前状态,则应使用状态更新器功能来检索它,例如setValue(currentState => currentState + 1).