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 是更安全和更推荐的选择。


参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
6月前
|
JavaScript 前端开发
useEffect与副作用
useEffect与副作用
55 0
|
1月前
|
前端开发 JavaScript 开发者
useEffect 钩子详解与实战
【10月更文挑战第3天】React 作为一个流行的 JavaScript 库,通过 Hooks 大幅简化了组件开发。`useEffect` 是一个核心 Hook,用于处理函数组件中的副作用操作,如数据获取和 DOM 更改。本文详细介绍了 `useEffect` 的基本语法、常见用法及示例,包括模拟 `componentDidMount`、`componentDidUpdate` 和 `componentWillUnmount`。此外,还探讨了如何避免无限循环渲染和内存泄漏等问题,并提供了相应的解决方案,帮助开发者更好地理解和应用 `useEffect`,提升应用程序的性能与稳定性。
49 7
|
2月前
|
缓存 前端开发
React中函数式Hooks之memo、useCallback的使用以及useMemo、useCallback的区别
React中的`memo`是高阶组件,类似于类组件的`PureComponent`,用于避免不必要的渲染。`useCallback` Hook 用于缓存函数,避免在每次渲染时都创建新的函数实例。`memo`可以接收一个比较函数作为第二个参数,以确定是否需要重新渲染组件。`useMemo`用于缓存计算结果,避免重复计算。两者都可以用来优化性能,但适用场景不同:`memo`用于组件,`useMemo`和`useCallback`用于值和函数的缓存。
82 1
|
4月前
|
前端开发 JavaScript 数据格式
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
react18【系列实用教程】Hooks (useState,useReducer,useRef,useEffect,useContext,useMemo,useCallback,自定义 Hook )
92 1
|
6月前
|
前端开发 JavaScript 开发者
掌握React中的useEffect:函数组件中的魔法钩子
掌握React中的useEffect:函数组件中的魔法钩子
|
JavaScript
useEffect和useLayoutEffect有什么区别
useEffect和useLayoutEffect有什么区别
|
6月前
|
前端开发
说说React中setState和replaceState的区别?
在 React 中,setState()和 replaceState()是用于更新组件状态的两个方法。它们之间有一些区别
47 0
|
6月前
|
前端开发 JavaScript
useState和useReducer的区别?
useState和useReducer的区别?
140 0
|
6月前
|
前端开发 JavaScript
react中的useState为什么是一个数组,而不是一个对象?
react中的useState为什么是一个数组,而不是一个对象?
131 0
|
前端开发
React setState执行两次的问题
React setState执行两次的问题解决修复。
436 1
React setState执行两次的问题