在我见过的大多数反应示例中,人们似乎避免将代码直接放入功能组件的主体中,而是将其包装到useEffect(() => {...})
中。 例如,在官方文档中:
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
为什么这比简单地写更好:
function Example() {
const [count, setCount] = useState(0);
document.title = `You clicked ${count} times`;
return (...);
}
在这两种情况下,文档标题都将在每次渲染时设置。(我相信useEffect()
代码是在渲染后执行的,但这似乎与此示例无关,对吧(
我理解useEffect()
的价值,如果:
- 作为第二个参数传递,因此代码不会在每个渲染上执行,而是针对指定的状态更改执行。
- 我们利用清理机制。
但是没有那个呢?还有理由将您的代码包装成useEffect()
吗?
回答我自己的问题。将代码包装到没有依赖项数组的useEffect
中与直接在函数体中将该代码包装在一起的区别在于,它将在每个组件呈现之后执行,而不是在之前执行。
查看当前的 react 文档(2023 年 6 月(
如果省略此参数,则每次重新渲染组件后,效果将重新运行
我相信一些(较旧的(教程省略了依赖数组,而包含它实际上更有意义。
然而,当前的 react 文档(2023 年 6 月(对这个主题非常清楚,并在这里给出了更深入的解释。
useEffect(() => {
document.title = `You clicked ${count} times`;
},[count]);
代码应该是这样的,因为现在useEffect只会在计数状态改变时调用
请参阅此处有关 useEffect 钩子的官方文档。useEffect
类似于componentDidMount
、componentDidUpdate
和componentWillUnmount
的组合。它给你任何提示吗?