useEffect(callback);
// Example
useEffect(() => {
console.log("executed after render phase");
return () => {
console.log("cleanup function after render");
};
});
- 在每个组件渲染上运行。
- 通常用于调试,类似于每次渲染时函数体的执行:
const Component = () => {
callback()
return <></>;
};
注意:在执行时间方面仍然存在差异(请参阅下一个注释)。检查此沙箱日志。
useEffect(callback,[]);
// Example
useEffect(() => {
const fetchUsers = async () => {
const users = await fetch();
setUsers(users);
};
fetchUsers();
console.log("called on component's mount");
return () => {
console.log("called on component's unmount");
};
}, []);
- 通常用于通过数据获取等初始化组件状态。
- 在组件安装上运行一次。
- 该清理功能将在组件的运行卸载。
陷阱:
请记住,首先进行渲染,然后进行安装。
粗略地说,大多数错误useEffect
是不知道闭包是如何工作的,也不注意linting 警告。
确保数组包含组件作用域中 随时间变化并由效果使用的所有值。否则,您的代码将引用之前渲染中的陈旧值-请在 React 文档中注意。
useEffect(callback,[arg]);
// Example
useEffect(() => {
console.log({ users });
return () => {
console.log("user value is changing");
};
}, [users]);
- 在
arg
值更改时运行。
- 通常用于在props/状态更改时运行事件。
- 可以提供多个依赖项:
[arg1,arg2,arg3...]
- 清除功能在
arg
值更改时运行。
陷阱:
- “On Change”是指与 的先前值进行浅比较
arg
。
即比较arg
来自前一个渲染和当前渲染的值,prevArg === arg ? doNothing() : callback()
。
其他注意事项
useEffect
浏览器重新绘制后触发的回调。
useEffect
以声明顺序执行的回调(与所有钩子一样),请查看示例。
- 每个人都
useEffect
应该有一个单一的责任。
- 如果您使用来自 的值
useRef
,则在清理函数中,事先将该值复制到回调的作用域。
const timeoutIdRef = useRef();
useEffect(() => {
const timeoutId = timeoutIdRef.current;
return () => {
/*
Using timeoutIdRef.current directly here is not safe
since you can't guarantee the ref to exists in this point
(especially when the component unmounts)
*/
// Should get a lint warning here
clearTimeout(timeoutIdRef.current); // BAD
// Closure on timeoutId value
clearTimeout(timeoutId); // GOOD
};
}, [arg]);
const isMounted = useRef(false);
useEffect(() => {
if (isMounted.current) {
// first mount
} else {
isMounted.current = true;
}
}, [arg]);
继续阅读: