useEffect 与 useLayoutEffect区别

简介: useEffect 与 useLayoutEffect区别

1. 前言

  1. 碰巧今天面试 react,问到这个问题(useEffect 和 useLayoutEffect有啥区别),都在射程范围内,那就来捋一捋

2. 是什么 what

  1. useEffectuseLayoutEffect是 React 提供的两个副作用钩子函数,用于在函数式组件中处理副作用操作

3. useEffect:

  1. useEffect 在组件渲染完成后执行,通常用于处理副作用操作,如数据获取、订阅事件、定时器等。
  2. useEffect 的回调函数会在每次渲染结束后异步执行,不会阻塞浏览器的渲染过程。
  3. useEffect 的回调函数可以返回一个清理函数,用于清除副作用操作,比如取消订阅、清除定时器等。
  4. useEffect 的执行时机是在浏览器完成绘制后,对用户来说是不可见的。

4. useLayoutEffect:

  1. useLayoutEffect 在组件渲染完成后,浏览器绘制之前执行,可以看作是 useEffect 的同步版本。
  2. useLayoutEffect 的回调函数会在每次渲染结束后同步执行,会阻塞浏览器的渲染过程,可能导致页面性能下降。
  3. useLayoutEffect 的回调函数也可以返回一个清理函数,用于清除副作用操作。
  4. useLayoutEffect 的执行时机是在浏览器完成绘制前,对用户来说是可见的。

5. useEffect 与 useLayoutEffect 对比 demo

import React, { useEffect, useLayoutEffect, useState } from 'react';
const Demo = () => {
  const [count, setCount] = useState(0);
  useEffect(() => {
    console.log('useEffect');
    document.title = `Count: ${count}`;
  }, [count]);
  useLayoutEffect(() => {
    console.log('useLayoutEffect');
    // 模拟一个耗时操作
    for (let i = 0; i < 1000000000; i++) {
      // Do something
    }
    document.title = `Count: ${count}`;
  }, [count]);
  return (
    <div>
      <h1>Count: {count}</h1>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
};
export default Demo;
  1. 先打印了 useEffect,然后是 useLayoutEffect。
  2. 这是因为useLayoutEffect在更新 DOM 前同步执行,可能会导致页面渲染的卡顿
  3. useEffect在页面渲染完成后异步执行,不会阻塞页面的渲染

6. 表格对比

useEffect useLayoutEffect
调用时机 组件渲染完成后异步执行 组件渲染完成后同步执行
执行时机 浏览器完成绘制后,对用户来说不可见 浏览器绘制前,对用户来说可见
阻塞渲染 不会阻塞浏览器的渲染过程 会阻塞浏览器的渲染过程
副作用操作 适用于大多数副作用操作 适用于需要立即执行、对布局有影响的副作用操作
清理函数 可以返回一个清理函数,用于清除副作用操作 可以返回一个清理函数,用于清除副作用操作
使用建议 在大多数情况下使用 useEffect 在需要同步执行、对布局有影响的情况下使用 useLayoutEffect
底层函数 调用的 mountEffectImpl方法 调用的 mountEffectImpl方法,在使用上也没什么差异,基本可以直接替换
  • 虽然 useLayoutEffect 在某些情况下可能会导致页面性能下降,
    但它在某些特定的场景下是非常有用的,例如在需要准确获取元素尺寸、计算布局等情况下。
  • 在大多数情况下,使用 useEffect 是更安全和更推荐的选择。


参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
7月前
|
前端开发
react hooks 使用小技巧—useState传值函数
当使用useState时,传入一个函数作为初始状态值的参数和传入一个值的参数的效果是一样的,都会在组件渲染时被调用,但它们的使用场景略有不同。
281 1
|
9月前
|
JavaScript
useEffect和useLayoutEffect有什么区别
useEffect和useLayoutEffect有什么区别
|
4天前
|
前端开发
说说React中setState和replaceState的区别?
在 React 中,setState()和 replaceState()是用于更新组件状态的两个方法。它们之间有一些区别
21 0
|
4天前
|
前端开发 JavaScript
useState和useReducer的区别?
useState和useReducer的区别?
36 0
|
4天前
|
前端开发 JavaScript
react中的useState为什么是一个数组,而不是一个对象?
react中的useState为什么是一个数组,而不是一个对象?
46 0
|
4天前
|
缓存 前端开发 JavaScript
React.Memo和useMemo的区别?
React.Memo和useMemo的区别?
75 0
|
5月前
|
存储 前端开发 JavaScript
useRef 和 useState 哪个更好?
useRef 和 useState 哪个更好?
39 1
|
9月前
|
存储 缓存 前端开发
React.memo() 和 useMemo() 的用法是什么,有哪些区别?
React.memo() 和 useMemo() 的用法是什么,有哪些区别?
101 0
|
11月前
|
前端开发 API 开发者
React18中useEffect执行两次
React18中useEffect执行两次
1023 3
|
前端开发
React 中的useState 和 setState 的执行机制
React 中的useState 和 setState 的执行机制