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


参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
安全 JavaScript
any和unknown有何区别?
any和unknown有何区别?
395 1
|
7月前
|
存储 人工智能 前端开发
无头 CMS 深度剖析:架构、优势与未来发展趋势
无头 CMS,即 Headless Content Management System,是一种将内容的管理与展示分离的内容管理系统。与传统 CMS 不同,它没有内置的前端展示层,仅专注于内容的创建、编辑、存储与管理。
532 6
无头 CMS 深度剖析:架构、优势与未来发展趋势
|
前端开发 开发者
类组件(Class component)和 函数式组件(Functional component) 之间有何区别?
类组件(Class component)和 函数式组件(Functional component) 之间有何区别?
304 0
|
JavaScript 前端开发 数据处理
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
这篇文章讨论了Vue中实现权限管理的策略,包括接口权限、路由权限、菜单权限和按钮权限的控制方法,并提供了不同的实现方案及代码示例,以确保用户只能访问被授权的资源。
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
|
前端开发 开发者 容器
BFC 及其应用详解
BFC(Block Format Context),即块级格式化上下文,是CSS中一种重要的布局方式,它能够解决浮动元素带来的问题,如元素塌陷等。通过触发BFC,可以将元素布局限制在一个独立的容器内,避免与外部元素相互影响。适用于需要对元素进行精确控制的场景。
|
Web App开发 缓存 UED
如何设置浏览器的缓存策略?
【10月更文挑战第23天】通过合理地设置浏览器的缓存策略,可以在提高网页性能、减少网络流量的同时,确保用户能够获取到最新的内容,从而提升用户体验和网站的性能优化效果。
1108 60
|
Web App开发 JavaScript 前端开发
浏览器与Node.js事件循环:异同点及工作原理
浏览器与Node.js事件循环:异同点及工作原理
|
JSON JavaScript Java
如何手写实现 JSON Parser
【11月更文挑战第10天】本文介绍了如何使用 Python 手写实现一个简单的 JSON 解析器。通过逐字符读取 JSON 字符串,解析出对象、数组、字符串、数字、布尔值和 null 等基本数据结构。文章详细描述了每个步骤的具体实现方法,包括去除空白字符、解析基础数据类型、解析字符串、数组和对象,以及核心的 `parse_value` 函数。最后,提供了一个完整的 JSON 解析器主函数示例。
300 2
ES5/ES6 的继承除了写法以外还有什么区别
ES5 和 ES6 的继承主要区别在于实现机制和语法糖。ES5 通过原型链和构造函数模拟类的继承,而 ES6 引入了 class 关键字,使继承更加直观和简洁,支持 super 调用父类方法,提升了代码可读性和维护性。
|
JavaScript 前端开发 应用服务中间件
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
529 0

热门文章

最新文章