useEffect
中的语句会 在组件第一次绘制后才执行。这一般是被期望的行为,比如你在 useEffect
中监听事件,不影响浏览器展示内容时。如果你需要在绘制前就执行,用 useLayoutEffect
;它除了初次被执行时间不一样外,其他都是一致的。
React 提供了在某些变量有变化时才触发执行的能力。比如下面的 props.source
:
useEffect(
() => {
const subscription = props.source.subscribe();
return () => {
subscription.unsubscribe();
};
},
[props.source],
);
如果你只想在组件 mount 和 umount 时执行语句,而不想其中 render 时也执行,那么可以用空的依赖变量:
useEffect(
() => {
const subscription = props.source.subscribe();
return () => {
subscription.unsubscribe();
};
},
[],
);