useEffect和useLayoutEffect的区别

烤冷面加辣条的抖音 - 抖音 (douyin.com)

一、看下面的代码,即使调换useLayoutEffect和useEffect的位置依旧是useLayoutEffect先输出。

import { useState, useEffect, useLayoutEffect } from "react";
const Index = () => {
  useLayoutEffect(() => {
    console.log("useLayoutEffect");
  }, []);
  useEffect(() => {
    console.log("useEffect");
  }, []);
  return (
    <>
      <div>hahahahhah</div>
    </>
  );
};
export default Index;

从下面代码可以看出useLayoutEffect有绝对的优先级,先执行

二、以下代码在点击刷新后,输出结果只和本身的顺序有关,全部是useLayoutEffect也是如此

三、

import { useState, useEffect, useLayoutEffect, useRef } from "react";
const Index = () => {
  const [aaa, setAaa] = useState(0);
  const [ccc, setCcc] = useState(false);
  const [ddd, setDdd] = useState(false);
  const bbb = useRef(0);
  const clickFunction = () => {
    // setAaa(aaa + 1)
    // bbb.current = bbb.current + 1;
    setCcc(!ccc);
  };
  useEffect(() => {
    console.log("useEffect, [aaa]");
  }, [aaa]);
  useEffect(() => {
    console.log("useEffect,[]");
  }, []);
  useEffect(() => {
    console.log("useEffect");
  });
  useLayoutEffect(() => {
    console.log("useLayoutEffect,[dd]");
  }, []);
  useLayoutEffect(() => {
    console.log("useLayoutEffect");
  });
  return (
    <>
      <button onClick={clickFunction}>32222222222222214</button>
    </>
  );
};
export default Index;

btn修改ccc的值

btn修改aaa的值

btn修改ddd的值

四、return不止在组件卸载后执行,也会在依赖值更新后执行,

import { useState, useEffect, useLayoutEffect, useRef } from "react";
const Index = () => {
  const [aaa, setAaa] = useState(0);
  const clickFunction = () => {
    setAaa(aaa + 1)
  };
  useEffect(() => {
    console.log("useEffect, [aaa]",aaa);
    return () => {
      console.log("useEffect, [aaa] return",aaa);
    }
  }, [aaa]);
  return (
    <>
      <button onClick={clickFunction}>32222222222222214</button>
    </>
  );
};
export default Index;

点击按钮后会:执行return

五、在看开源项目的时候发现useEffect的使用场景有如下大多数都有依赖值

1、useEffect里如果造成内存泄露的化,会在return里清空

2、会请求数据

3、依赖值可以有多个,依赖值变化就会去执行相关函数

	useEffect(() => {
		// 全局使用国际化
		i18n.changeLanguage(language || getBrowserLang());
		setLanguage(language || getBrowserLang());
		setAntdLanguage();
	}, [language]);

	useEffect(() => {
		if (echartsRef?.current) {
			myChart.current = echarts.init(echartsRef.current as HTMLDivElement);
		}
		myChart?.current?.setOption(options);
		window.addEventListener("resize", echartsResize, false);
		return () => {
			window.removeEventListener("resize", echartsResize);
			myChart?.current?.dispose();
		};
	}, []);

	useEffect(() => {
		timer.current = setInterval(() => {
			setTime(moment().format("YYYY年MM月DD日 HH:mm:ss"));
		}, 1000);
		return () => {
			clearInterval(timer.current);
		};
	}, [time]);

	// 获取按钮权限列表
	const getAuthButtonsList = async () => {
		const { data } = await getAuthorButtons();
		setAuthButtons(data);
	};
	// 监听窗口大小变化
	const listeningWindow = () => {
		window.onresize = () => {
			return (() => {
				let screenWidth = document.body.clientWidth;
				if (!isCollapse && screenWidth < 1200) updateCollapse(true);
				if (!isCollapse && screenWidth > 1200) updateCollapse(false);
			})();
		};
	};
	useEffect(() => {
		listeningWindow();
		getAuthButtonsList();
	}, []);

	useEffect(() => {
		screenfull.on("change", () => {
			if (screenfull.isFullscreen) setFullScreen(true);
			else setFullScreen(false);
			return () => screenfull.off("change", () => {});
		});
	}, []);

	// 刷新页面菜单保持高亮
	useEffect(() => {
		setSelectedKeys([pathname]);
		isCollapse ? null : setOpenKeys(getOpenKeys(pathname));
	}, [pathname, isCollapse]);

更多参考官网:使用 Effect 同步 – React 中文文档

总结:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天吃饭的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值