useEffect 与 useLayoutEffect 和 useMutationEffect 的区别

useEffect

99% 的情况下都用这个。当钩子稳定并且如果重构任何类组件以使用钩子时,可以将任何代码从 componentDidMount、componentDidUpdate 和 componentWillUnmount 移动到 useEffect。

useLayoutEffect

这会在 React 执行完所有 DOM 更改后立即同步运行。useLayoutEffect和componentDidMount和componentDidUpdate触发时机一致(都在在DOM修改后且浏览器渲染之前)。useLayoutEffect要比useEffect更早的触发执行。useLayoutEffect会阻塞浏览器渲染,执行同步会耗时。如果需要进行 DOM 测量数值(例如获取元素的滚动位置或其他样式),然后进行 DOM 突变或通过更新状态触发同步重新渲染,用这个钩子准没错。

useEffect 与 useLayoutEffect的例子

function LayoutEffect() {
    const [color, setColor] = useState('pink');
    useLayoutEffect(() => {
        alert(color); // 先弹窗,再重绘
    });
    useEffect(() => {
        console.log('color', color);// 重绘同时打印颜色
    });
    return (
        <>
            <div id="myDiv" style={{ border: `10px solid ${color}` }}>
                <button onClick={() => setColor('pink')}>粉红</button>
                <button onClick={() => setColor('lightgreen')}>浅绿</button>
                <button onClick={() => setColor('lightblue')}>浅蓝</button>
            </div>
        </>
    );
}

先弹窗,再重绘
重绘同时打印useEffect里的log

useMutationEffect

这在 React 渲染您的组件的同时同步运行。如果要改变 DOM,就用这个钩子,但前提是你不需要从 DOM 中读取值。(这个钩子貌似已经废弃了)

总结

  • useMutationEffect:如果你需要改变 DOM 但不需要执行测量数值
  • useLayoutEffect
    • useLayoutEffect 会在 浏览器 layout 之后,painting 之前执行。
    • 如果你需要改变 DOM 或者DOM需要获取测量数值,除非要修改DOM并且不让用户看到修改DOM的过程,才考虑用它来读取 DOM 布局并同步触发重渲染,否则应当使用useEffect。
    • 在浏览器执行绘制之前 useLayoutEffect 内部的更新计划将被同步刷新。
    • 尽可能使用标准的 useEffect 以避免阻塞视图更新
  • useEffectuseEffect 在全部渲染完毕后才会执行。 如果根本不需要与 DOM 交互或者你的 DOM 更改是不可观察的,那就用useEffect。

公众号

欢迎大家关注我的公众号: 石马上coding,一起成长
石马上coding

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值