• useLayoutEffect和useEffect的区别


    使用方式

    这两个函数的使用方式其实非常简单,他们都接受一个函数一个数组,只有在数组里面的值改变的情况下才会再次执行 effect。所以对于使用方式我就不过多介绍了,不清楚的可以先参考官网 

    差异

    • useEffect 是异步执行的,而useLayoutEffect是同步执行的。
    • useEffect 的执行时机是浏览器完成渲染之后,而 useLayoutEffect 的执行时机是浏览器把内容真正渲染到界面之前,和 componentDidMount 等价。
    1. import React, { useEffect, useLayoutEffect, useState } from 'react';
    2. import logo from './logo.svg';
    3. import './App.css';
    4. function App() {
    5. const [state, setState] = useState("hello world")
    6. useEffect(() => {
    7. let i = 0;
    8. while(i <= 100000000) {
    9. i++;
    10. };
    11. setState("world hello");
    12. }, []);
    13. // useLayoutEffect(() => {
    14. // let i = 0;
    15. // while(i <= 100000000) {
    16. // i++;
    17. // };
    18. // setState("world hello");
    19. // }, []);
    20. return (
    21. <>
    22. <div>{state}div>
    23. );
    24. }
    25. export default App;

    它的效果 

     

     

    而换成 useLayoutEffect 之后闪烁现象就消失了

    看到这里我相信你应该能理解他们的区别了,因为 useEffect 是渲染完之后异步执行的,所以会导致 hello world 先被渲染到了屏幕上,再变成 world hello,就会出现闪烁现象。而 useLayoutEffect 是渲染之前同步执行的,所以会等它执行完再渲染上去,就避免了闪烁现象。也就是说我们最好把操作 dom 的相关操作放到 useLayouteEffect 中去,避免导致闪烁。

    总结

    1. 优先使用 useEffect,因为它是异步执行的,不会阻塞渲染
    2. 会影响到渲染的操作尽量放到 useLayoutEffect中去,避免出现闪烁问题
    3. useLayoutEffectcomponentDidMount是等价的,会同步调用,阻塞渲染
    4. 在服务端渲染的时候使用会有一个 warning,因为它可能导致首屏实际内容和服务端渲染出来的内容不一致。
  • 相关阅读:
    R语言绘制分组方框图四
    OceanBase数据库简单安装部署——筑梦之路
    .net core 3.0 NLog 日志的使用
    服务器被黑该如何查找入侵痕迹以及如何防御攻击
    如何使一个不定宽和不定高的元素垂直水平居中
    冒泡排序及其优化
    互联网轻量级框架整合之JavaEE基础II
    在EVE-NG 平台导入锐捷模拟器镜像流程
    selenium长截图,截图整个页面
    NYOJ - 91 - 阶乘之和(贪心算法)
  • 原文地址:https://blog.csdn.net/m0_49471668/article/details/134042615