Reactjs React-是useState';s设置器功能是否可以更改?

Reactjs React-是useState';s设置器功能是否可以更改?,reactjs,react-hooks,Reactjs,React Hooks,useState的setter是否能够在组件寿命期间更改 例如,假设我们有一个useCallback,它将更新状态。 如果setter可以更改,则必须将其设置为回调的依赖项,因为回调使用它 const [state, setState] = useState(false); const callback = useCallback( () => setState(true), [setState] // <-- ); const[state,setState]=u

useState的setter是否能够在组件寿命期间更改

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

const [state, setState] = useState(false);
const callback = useCallback(
    () => setState(true),
    [setState] // <-- 
);
const[state,setState]=useState(false);
const callback=useCallback(
()=>设置状态(真),

[setState]/setter功能在组件寿命期间不会改变

(setCount函数的标识保证是稳定的,因此可以安全地省略。)

setter函数(
setState
)从组件重新装载时的
useState
更改返回,但无论如何,
回调将获得一个新实例

使用自定义挂钩时,在依赖项数组中添加状态设置器(
[setState]
)是一种很好的做法。例如,在每次渲染时获取新实例,您可能会获得不需要的行为,而不会:

// 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};
导出常量计数器组件=({value})=>{
//总是新实例
const dispatch=usedpatch();
//应该在回调中
const incrementCounter=useCallback(
()=>dispatch({type:“increment counter”}),
[快讯]
);
返回(
{value}
//可能由于引用更改而呈现不必要的内容
//总之,一切都好
);
};

简短的回答是,否,useState()的setter不能更改,和,甚至提供示例证明可以省略setter

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

尽管如此,这都是由useState()返回的函数所特有的,没有理由将这条推理线扩展到每个可能返回函数的自定义钩子。原因是React文档明确保证了useState()的稳定行为及其设置程序,但它并没有说对于任何自定义挂钩都必须如此


React钩子仍然是一种新的实验性概念,我们需要确保彼此鼓励,使它们尽可能可读,更重要的是,要理解它们实际上做了什么以及为什么。如果我们不这样做,就会被视为钩子是“坏主意”的证据这将禁止采用和更广泛地理解它们。那将是不好的;根据我的经验,它们倾向于产生更干净的替代品,而基于类的组件通常与之相关,更不用说它们可以允许在类中根本不可能实现的组织技术了。

感谢Dennis的帮助我们的答案。当然,当安装一个组件时,钩子会被重置。我的意图只是在一个组件的生命周期内,所以我编辑了这个问题。此外,我的问题只是关于
useState
setter。自定义钩子,因为它们是自定义的,当然我们应该随时准备对它们进行更改,除非它们的文档另有说明。但是因为一方面,我没有看到
setState
hook的文档这么说,但另一方面,实验表明setter实例在一个组件的生命周期内不会改变,所以我要问一个关于Stackoverflow的问题。
内置的
hook不会改变,但我必须注意定制的hook。噢..我补充道引用文档中的一段话,对于我在Dan Abramov的博客文章相关的地方读到的其他钩子:>例如,useDispatch of react redux在每次渲染时都会获得新实例,您可能会>在没有以下内容的情况下获得不想要的行为:文档要求不同:“只要将同一存储实例传递给,分派函数引用将保持稳定。”