useState的setter是否保证是相同的?

时间:2019-02-06 20:46:01

标签: javascript reactjs react-hooks

说我想创建常用的useInputState钩子:

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

我需要在回调的依赖项中添加setValue setter函数吗? 我们可以依靠二传手保持不变吗? 当我尝试时,这似乎可行,但这是一种好习惯吗?还是我们应该假设回调闭包中的任何内容都可以更改并影响其实现?

(我可以想到更多最终引发相同问题的示例)

2 个答案:

答案 0 :(得分:2)

是的,来自useState的设置者和来自useReducer的调度都没有改变。

This portion of the docs涵盖了通过上下文将dispatch方法传递给后代组件的模式,并且包含以下内容:

  

如果您也使用上下文传递状态,请使用两个不同的   上下文类型-调度上下文永远不会改变,因此组件   阅读,无需重新提交,除非他们也需要该应用程序   状态。

答案 1 :(得分:1)

是的,useState状态设置器具有相同的功能;即使不会,它也会更新状态。应该像问题显示一样使用它。

useReducer documentation中可以更好地解释常用用法:

  

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

还有useState uses useReducer internally

与调用useState的作用域有关的关注点仅适用于useState状态值,该状态值在使用回调的作用域中保持不变,例如this problem。如果应该使用当前状态,则应使用状态更新器功能(例如setValue(currentState => currentState + 1))来检索它。