当前位置: 首页 > news >正文

React中的useMemo 和 useEffect 哪个先执行?

在 React 组件的渲染过程中,useMemo 和 useEffect 的执行顺序是不同的。具体来说:

  1. useMemo 先执行:useMemo 是在 渲染阶段 执行的,它的作用是缓存计算结果,确保在渲染过程中可以直接使用缓存的值。

  2. useEffect 后执行:useEffect 是在 提交阶段 执行的,它的作用是处理副作用(如数据获取、DOM 操作等),并且是在 DOM 更新之后才运行。

详细执行顺序

  1. 组件渲染阶段:
  • React 调用组件的渲染方法(函数组件的函数体或类组件的 render 方法)。

  • 在渲染过程中,useMemo 会被执行,计算并缓存值。

  • 如果依赖项没有变化,useMemo 会直接返回缓存的值,避免重复计算。

  1. DOM 更新阶段:
  • React 将组件的渲染结果应用到 DOM 上,更新 UI。
  1. 提交阶段:
  • 在 DOM 更新完成后,React 会执行 useEffect 中的副作用函数。

  • 如果 useEffect 有清理函数(返回的函数),它会在组件卸载或依赖项变化时执行。

示例代码

import React, { useMemo, useEffect, useState } from 'react';function MyComponent({ a, b }) {// useEffect 写在 useMemo 上面useEffect(() => {console.log('useEffect: Side effect after DOM update');return () => {console.log('useEffect: Cleanup');};}, [a, b]);// useMemo 写在 useEffect 下面const memoizedValue = useMemo(() => {console.log('useMemo: Calculating expensive value...');return a + b;}, [a, b]);console.log('Render: Component rendering...');return (<div><p>Memoized Value: {memoizedValue}</p></div>);
}function App() {const [a, setA] = useState(1);const [b, setB] = useState(2);return (<div><MyComponent a={a} b={b} /><button onClick={() => setA(a + 1)}>Increment A</button><button onClick={() => setB(b + 1)}>Increment B</button></div>);
}

控制台输出顺序

  1. 当组件首次渲染时:
Render: Component rendering...
useMemo: Calculating expensive value...
useEffect: Side effect after DOM update
  1. 当 a 或 b 变化时:
Render: Component rendering...
useMemo: Calculating expensive value...
useEffect: Cleanup
useEffect: Side effect after DOM update

总结

  • useMemo 在渲染阶段执行:无论它写在 useEffect 上面还是下面,它都会在组件渲染时执行。

  • useEffect 在提交阶段执行:它总是在 DOM 更新后执行,与代码书写顺序无关。

  • React 的执行顺序是固定的:useMemo 先执行,useEffect 后执行。

如果你需要在渲染阶段避免昂贵的计算,使用 useMemo;如果你需要在 DOM 更新后执行某些操作(如数据获取或订阅),使用 useEffect。

http://www.lryc.cn/news/519517.html

相关文章:

  • 错误修改系列---基于RNN模型的心脏病预测(pytorch实现)
  • Table-Augmented Generation(TAG):Text2SQL与RAG的升级与超越
  • Stable Diffusion本地部署教程(附安装包)
  • 【物联网原理与运用】知识点总结(上)
  • JuiceFS 2024:开源与商业并进,迈向 AI 原生时代
  • C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码
  • 计算机网络(六)应用层
  • 上海亚商投顾:沪指探底回升微涨 机器人概念股午后爆发
  • conda相关操作
  • 使用TCP协议实现智能聊天机器人
  • PHP二维数组去除重复值
  • 2025年01月11日Github流行趋势
  • 备战蓝桥杯 队列和queue详解
  • IT面试求职系列主题-Jenkins
  • Vue篇-06
  • mysql binlog 日志分析查找
  • ubuntu 配置OpenOCD与RT-RT-thread环境的记录
  • 双系统解决开机提示security Policy Violation的方法
  • 附加共享数据库( ATTACH DATABASE)的使用场景
  • matlab的绘图的标题中(title)添加标量以及格式化输出
  • 2、第一个GO 程序
  • 【Linux-多线程】-线程安全单例模式+可重入vs线程安全+死锁等
  • 00000007_C语言设计模式
  • 探索数据存储的奥秘:深入理解B树与B+树
  • Web渗透测试之XSS跨站脚本之JS输出 以及 什么是闭合标签 一篇文章给你说明白
  • EasyExcel的应用
  • VS Code的设置功能以及多层级的设置方式与解密
  • UI自动化测试框架playwright--初级入门
  • SQL多表联查、自定义函数(字符串分割split)、xml格式输出
  • Fast API使用