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

server/2025/1/12 3:19:38/

在 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.ppmy.cn/server/157237.html

相关文章

字节小米等后端岗位C++面试题

C 基础 引用和指针之间的区别&#xff1f;堆栈和堆中的内存分配有何区别&#xff1f;存在哪些类型的智能指针&#xff1f;unique_ptr 是如何实现的&#xff1f;我们如何强制在 unique_ptr 中仅存在一个对象所有者&#xff1f;shared_ptr 如何工作&#xff1f;对象之间如何同步…

【第04阶段-机器学习深度学习篇-1-深度学习基础-深度学习介绍】

1 深度学习概念 深度学习是基于机器学习延伸出来的一个新的领域&#xff0c;由以人大脑结构为启发的神经网络算法为起源加之模型结构深度的增加发展&#xff0c;并伴随大数据和计算能力的提高而产生的一系列新的算法。 2 深度学习发展 其概念由著名科学家Geoffrey Hinton等人…

深入Android架构(从线程到AIDL)_19 IPC的Proxy-Stub设计模式01

1、 复习&#xff1a; IBinder 接口 onTransact()就是EIT造形里的<I>这是标准的EIT造形&#xff0c;其<I>是支持<基类/子类>之间IoC调用的接口。运用曹操(Stub)类&#xff0c;形成两层EIT(两层框架)。

使用 C++ 实现神经网络:从基础到高级优化

引言 在现代机器学习中&#xff0c;神经网络已经成为最重要的工具之一。虽然 Python 提供了诸如 TensorFlow、PyTorch 等强大的机器学习库&#xff0c;但如果你想深入理解神经网络的实现原理&#xff0c;或者出于某些性能、资源限制的考虑&#xff0c;使用 C 来实现神经网络会是…

架构学习——互联网常用架构模板

1 总体结构 如上涵盖了互联网技术公司的大部分技术点&#xff0c;不同的公司使用的具体技术和实现有差异&#xff0c;到哪不会跳出框架范畴 2 存储层技术 2.1 SQL SQL为我们说的关系数据&#xff0c;互联网行业非常也必须依赖关系数据 但Oracle又太贵&#xff0c;还需要专人维…

GPTs与鸿蒙HarmonyOS应用开发的深度融合:探索与实践

文章目录 一、GPTs与鸿蒙HarmonyOS的融合背景与意义二、GPTs在鸿蒙HarmonyOS应用开发中的应用场景1. 智能助手与对话系统2. 个性化内容推荐3. 企业级应用与协同办公 三、技术挑战与解决方案《GPTs与GPT Store应用开发详解》亮点内容简介作者简介目录 《鸿蒙HarmonyOS应用开发从…

Android NDK开发入门2之适应idm环境

环境搭建 Android NDK开发实战之环境搭建篇(so库,Gemini ai)-CSDN博客 初始配置 前面已经运行了一个简单的初始程序&#xff0c;现在我们来往初始程序添加类和函数&#xff0c;并成功运行的实验。 一级配置 第一层配置主要是cmake文件环境和一些编译选项。 build配置 可参…

预测市场平台 Aegis:Al Agent + Web3,为预测市场提供新的动力

2024 年是美国的大选年&#xff0c;并且在此期间也发生了许多值得关注的事件。我们看到&#xff0c;围绕特朗普、哈里斯的一场大选好戏&#xff0c;持续为加密市场提供了话题热度&#xff0c;同样大选也让预测市场的影响力日益凸显。事实上&#xff0c;预测市场的数据正在被采用…