Reactjs React-是useState';s设置器功能是否可以更改?
useState的setter是否能够在组件寿命期间更改 例如,假设我们有一个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
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在每次渲染时都会获得新实例,您可能会>在没有以下内容的情况下获得不想要的行为:文档要求不同:“只要将同一存储实例传递给,分派函数引用将保持稳定。”