说我想创建常用的useInputState
钩子:
function useInputState(initialValue) {
const [value, setValue] = useState(initialValue);
const onChange = useCallback(
e => setValue(e.target.value),
[ /* ??? */ ]
);
return { value, onChange };
}
我需要在回调的依赖项中添加setValue
setter函数吗?
我们可以依靠二传手保持不变吗?
当我尝试时,这似乎可行,但这是一种好习惯吗?还是我们应该假设回调闭包中的任何内容都可以更改并影响其实现?
(我可以想到更多最终引发相同问题的示例)
答案 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)
)来检索它。