React - useState 的 setter 函数可以改变吗?

IT技术 reactjs react-hooks
2021-04-14 21:24:46

useState 的 setter 能否在组件生命周期内更改?

例如,假设我们有一个useCallback将更新状态。如果 setter 能够更改,则必须将其设置为回调的依赖项,因为回调使用它。

const [state, setState] = useState(false);
const callback = useCallback(
    () => setState(true),
    [setState] // <-- 
);
2个回答

setter函数在组件寿命期间不会改变

从 Hooks 常见问题解答:

( setCount 函数的身份保证是稳定的,所以省略是安全的。)

setter 函数 ( setState) 从useState组件重新安装时的更改返回,但无论哪种方式,callback都将获得一个新实例。

[setState]使用custom-hooks,在依赖数组 ( ) 中添加状态设置器是一个很好的做法例如,在每次渲染useDispatchreact-redux获取新实例,您可能会在没有以下情况下获得不希望的行为:

// Custom hook
import { useDispatch } from "react-redux";

export const CounterComponent = ({ value }) => {
  // Always new instance
  const dispatch = useDispatch();

  // Should be in a callback
  const incrementCounter = useCallback(
    () => dispatch({ type: "increment-counter" }),
    [dispatch]
  );

  return (
    <div>
      <span>{value}</span>

      // May render unnecessarily due to the changed reference
      <MyIncrementButton onIncrement={dispatch} />

      // In callback, all fine
      <MyIncrementButton onIncrement={incrementCounter} />
    </div>
  );
};
> 例如,react-redux 的 useDispatch 在每次渲染时都会获取新实例,您可能会 > 得到不希望的行为: 文档有所不同:“只要将相同的 store 实例传递给<提供者>。” reactjs.org/docs/hooks-reference.html#usestate
2021-05-30 21:24:46
哦..😄你说内置的钩子不会改变?请问来源是什么?也许你,如果你在 React 项目工作 😉。--- 您适合自定义挂钩,任何人都可能需要此信息。
2021-06-08 21:24:46
built-in钩不会改变,但对我来说需要注意的定制挂钩是非常重要的。
2021-06-13 21:24:46
感谢丹尼斯的回答。当然,当一个组件被安装时,钩子会被重置。我的目的只是在一个组件的生命周期内,所以我编辑了这个问题。此外,我的问题仅在useState二传手上。自定义钩子,因为它们是自定义的,当然我们应该准备好随时更改它们,除非他们的文档另有说明。但是因为一方面我没有看到setState钩子的文档这么说,但另一方面实验表明 setter 实例在一个组件的生命周期中不会改变,所以我在 Stackoverflow 上问这个问题。
2021-06-14 21:24:46
我添加了文档中的引用,对于其他钩子,我在与 Dan Abramov 的这篇博文相关的地方阅读了它:overreacted.io/why-do-hooks-rely-on-call-order
2021-06-14 21:24:46

简短的回答是,不,useState的二传手()不能改变,以及做出react的文档明确保证这一点,甚至提供实例证明二传手可以省略。

我建议您不要在useCallback()的依赖项列表中添加任何内容,除非您知道它的值可以更改。就像您不会添加从module或module级函数导入的任何函数、在组件外部定义的常量表达式等一样。添加这些东西只是多余的,并且会使您的处理程序更难以阅读。

话虽如此,这一切都非常特定于useState()返回的函数,并且没有理由将该推理线扩展到可能返回函数的每个可能的自定义钩子。原因是 React 文档明确保证useState()及其 setter的稳定行为,但并没有说任何自定义钩子都必须如此。

React hooks 仍然是一种新的实验性概念,我们需要确保我们相互鼓励,使它们尽可能具有可读性,更重要的是,了解它们的实际作用以及原因。如果我们不这样做,它将被视为证明钩子是一个“坏主意”的证据,这将禁止采用和更广泛地理解它们。那会很糟糕;根据我的经验,他们倾向于为 React 通常关联的基于类的组件提供更清洁的替代方案,更不用说他们可以允许使用类根本不可能实现的组织技术的事实。