美文网首页
useEffect和useLayoutEffect

useEffect和useLayoutEffect

作者: AAA前端 | 来源:发表于2021-07-27 11:10 被阅读0次

    useEffect

    该 Hook 接收一个包含命令式、且可能有副作用代码的函数

    使用 useEffect 完成副作用操作。赋值给 useEffect 的函数会在组件渲染到屏幕之后执行。你可以把 effect 看作从 React 的纯函数式世界通往命令式世界的逃生通道。

    清除 effect
    通常,组件卸载时需要清除 effect 创建的诸如订阅或计时器 ID 等资源。要实现这一点,useEffect 函数需返回一个清除函数

    useEffect(() => {
      const subscription = props.source.subscribe();
      return () => {
        // 清除订阅
        subscription.unsubscribe();
      };
    });
    

    为防止内存泄漏,清除函数会在组件卸载前执行。另外,如果组件多次渲染(通常如此),则在执行下一个 effect 之前,上一个 effect 就已被清除。在上述示例中,意味着组件的每一次更新都会创建新的订阅。

    effect 的执行时机
    与 componentDidMount、componentDidUpdate 不同的是,传给 useEffect 的函数会在浏览器完成布局与绘制之后,在一个延迟事件中被调用。这使得它适用于许多常见的副作用场景,比如设置订阅和事件处理等情况,因为绝大多数操作不应阻塞浏览器对屏幕的更新。

    useLayoutEffect

    并非所有 effect 都可以被延迟执行。例如,一个对用户可见的 DOM 变更就必须在浏览器执行下一次绘制前被同步执行,这样用户才不会感觉到视觉上的不一致。(概念上类似于被动监听事件和主动监听事件的区别。)React 为此提供了一个额外的 useLayoutEffect Hook 来处理这类 effect。它和 useEffect 的结构相同,区别只是调用时机不同。

    其函数签名与 useEffect 相同,但它会在所有的 DOM 变更之后同步调用 effect。可以使用它来读取 DOM 布局并同步触发重渲染。在浏览器执行绘制之前,useLayoutEffect 内部的更新计划将被同步刷新。
    尽可能使用标准的 useEffect 以避免阻塞视觉更新

    栗子

    import React, { useEffect, useLayoutEffect, useRef } from "react";
    import TweenMax from "gsap/TweenMax";
    import './index.less';
    
    const Animate = () => {
        const REl = useRef(null);
        useEffect(() => {
            /*下面这段代码的意思是当组件加载完成后,在0秒的时间内,将方块的横坐标位置移到600px的位置*/
            TweenMax.to(REl.current, 0, {x: 600})
        }, []);
        return (
            <div className='animate'>
                <div ref={REl} className="square">square</div>
            </div>
        );
    };
    
    export default Animate;
    
    useEffect

    可以清楚的看到有一个一闪而过的方块.

    useLayoutEffect

    useLayoutEffect 可以看出,每次刷新,页面基本没变化

    参考来源:
    https://zh-hans.reactjs.org/docs/hooks-reference.html#useeffect
    https://zh-hans.reactjs.org/docs/hooks-reference.html#uselayouteffect
    https://www.jianshu.com/p/412c874c5add

    相关文章

      网友评论

          本文标题:useEffect和useLayoutEffect

          本文链接:https://www.haomeiwen.com/subject/nbznmltx.html