前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:useLayoutEffect和useEffect的区别

面试官:useLayoutEffect和useEffect的区别

原创
作者头像
全栈潇晨
发布2021-12-15 07:59:39
1.5K0
发布2021-12-15 07:59:39
举报

面试官:useLayoutEffect和useEffect的区别

hello,这里是潇晨,大家面试的过程中有没有遇到过这样的问题呢,useLayoutEffect和useEffect的区别是什么,大家可能会回答useEffect是异步的,useLayoutEffect是同步的,这样回答面试官真的会满意慢,我们需要说清楚他们在源码中的调用时机。

先来看个例子:点击触发更新之后,如果count之前的状态是0,我们随机生成一个数字,在阻塞一段时间,在设置count位随机值,看看在useEffect和useLayoutEffect这两种情况下会有什么不同

代码语言:javascript
复制
import React, { useLayoutEffect, useState, useEffect } from "react";

export default function App() {
  const [count, setCount] = useState(0);

  //用 useLayoutEffect 试试
  useEffect(() => {
    if (count === 0) {
      const randomNum = Math.random() * 100;//随机生成一个数字

      const now = performance.now();

      while (performance.now() - now < 100) {//阻塞一段时间
        console.log('blocking...');
      }

      setCount(randomNum);//重新设置状态,设置成随机数
    }
  }, [count]);

  return <div onClick={() => setCount(0)}>{count}</div>;
}

//在useEffect的情况下,不断点击触发更新,偶尔会显示0
//在useLayoutEffect的情况下,不断点击触发更新,不会偶现0

在源码中不管首次渲染还是更新的时候都会经历一个阶段叫commit阶段,这个阶段主要的工作就是处理一些钩子函数、生命周期、遍历render阶段形成的EffectList链表,将带有副作用的Fiber节点应用到真实节点上,如果对render阶段不了解可以参阅往期文章 render阶段 ,下面这张图是commit阶段源码的结构图,我们详细的讲解一下。

在commitRootImpl的函数中主要分三个部分:

  • commit阶段前置工作
  • mutation阶段
  1. 调用commitBeforeMutationEffects,scheduleCallback调度执行flushPassiveEffects
  2. 调用commitMutationEffects,处理相关的副作用,操作真实节点useLayoutEffect的销毁函数在这个函数中执行
  3. 调用commitLayoutEffects,调用commitLayoutEffects的回调函数,这个时候副作用已经应用到真实节点了,所以能拿到最新的节点。
  4. 在commit阶段结束之后flushPassiveEffects执行useEffect的销毁函数和回调函数。
  • commit阶段收尾工作

所以useLayout/componentDidMount和useEffect的区别是什么?

答:他们在commit阶段不同时机执行,useEffect在commit阶段结尾异步调用,useLayout/componentDidMount同步调用

详细源码调试视频(高效学习):点击学习

往期react源码解析文章:

1.开篇介绍和面试题

2.react的设计理念

3.react源码架构

4.源码目录结构和调试

5.jsx&核心api

6.legacy和concurrent模式入口函数

7.Fiber架构

8.render阶段

9.diff算法

10.commit阶段

11.生命周期

12.状态更新流程

13.hooks源码

14.手写hooks

15.scheduler&Lane

16.concurrent模式

17.context

18事件系统

19.手写迷你版react

20.总结&第一章的面试题解答

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面试官:useLayoutEffect和useEffect的区别
    • 详细源码调试视频(高效学习):点击学习
      • 往期react源码解析文章:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档