【问题标题】:is the useState's setter guaranteed to be the same?useState 的 setter 是否保证相同?
【发布时间】:2019-06-30 22:01:42
【问题描述】:

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

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

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

(我能想到更多最终提出相同问题的例子)

【问题讨论】:

    标签: javascript reactjs react-hooks


    【解决方案1】:

    是的,来自useState 的 setter 以及来自useReducer 的类似调度不会改变。

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

    如果您也使用上下文来传递状态,请使用两个不同的 上下文类型——调度上下文永远不会改变,所以组件 阅读它不需要重新渲染,除非他们也需要应用程序 状态。

    【讨论】:

      【解决方案2】:

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

      常见用法在useReducerdocumentation中有更好的解释:

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

      还有useState uses useReducer internally

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

      【讨论】:

      • 谢谢,这回答了我的问题 :) 我不知道 useState 是在内部使用 useReducer 实现的!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 2022-07-27
      • 2021-01-26
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      相关资源
      最近更新 更多