最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • useEffect和useLayoutEffect对比

    正文概述 掘金(小郭郭yu)   2021-05-10   606

    useEffect

    回调在react渲染组件之后执行,并且确保回调不会阻止浏览器绘制(异步的) 执行过程是这样的:

    1. 触发了一个导致重新渲染的操作(改变state、props改变)
    2. react重新渲染组件(调用)
    3. 屏幕可以看到更新
    4. useEffect的回调执行

    useLayoutEffect

    在react渲染组件之后同步执行 执行过程是这样的:

    1. 触发了一个导致重新渲染的操作(改变state、props改变)
    2. react重新渲染组件(调用)
    3. useLayoutEffect回调函数执行
    4. 屏幕看到更新

    代码示例

    import React, { useState, useEffect } from "react";
    import ReactDOM from "react-dom";
    import "./styles.css";
    
    const BlinkyRender = () => {
      const [value, setValue] = useState(0);
    
      useEffect(() => {
        if (value === 0) {
          setValue(10 + Math.random() * 200);
        }
      }, [value]);
    
      console.log("render", value);
    
      return (
        <div onClick={() => setValue(0)}>value: {value}</div>
      );
    };
    
    ReactDOM.render(
      <BlinkyRender />,
      document.querySelector("#root")
    );
    

    上面这样的代码,点击div,有可能导致页面更新两次(闪烁),使用useLayoutEffect就不会了 useEffect执行过程:

    1. 点击div
    2. state改变,导致react组件重新执行
    3. 屏幕更新
    4. useEffect执行,state再次改变
    5. react组件重新执行,屏幕更新

    useLayoutEffect执行过程:

    1. 点击div
    2. state改变,react组件重新执行
    3. useLayoutEffect,state改变
    4. react组件再次执行更新
    5. 屏幕更新

    总结

    • useLayoutEffect是同步的,在回调执行后才会浏览器才会更新,如果回调执行时间过长,就会导致画面迟迟不能更新,大部分情况使用useEffect
    • 如果发现了屏幕闪烁的问题,请尝试下useLayoutEffect

    参考文章:daveceddia.com/useeffect-v…


    起源地下载网 » useEffect和useLayoutEffect对比

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元