首页 > 其他分享 >react.js中useMemo和useEffect的区别

react.js中useMemo和useEffect的区别

时间:2024-10-29 18:59:18浏览次数:4  
标签:expensiveOperation ExpensiveComponent useMemo someProp scrollToBottom react useE

1、当messages发生变化时执行scrollToBottom方法

useEffect(() => {
scrollToBottom();
}, [messages]);

const scrollToBottom = () => {

//页面滚动到底部
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
}

以上例子中,useEffect可以用useMemo代替吗?

不可以。

这里,useEffect 是在 messages 依赖项变化后执行 scrollToBottom 函数,这是一个典型的副作用使用场景(进行了Dom操作),因为你想在消息更新后滚动到底部。

如果你的问题是关于是否可以用 useMemo 来记住或优化 scrollToBottom 函数的调用,那么答案是不适用的。因为 useMemo 是用于记住某个计算结果的,而 scrollToBottom 是一个执行副作用的函数,它并不返回一个可以被记住的值。

2、使用useMemo和不使用useMemo的区别:

import React from 'react';
function ExpensiveComponent({ someProp }) {
const expensiveValue = expensiveOperation(someProp);
return (
<div>
  {expensiveValue}
</div>
);
}

function expensiveOperation(value) {

console.log('ExpensiveComponent组件刷新时执行")//打印
// 模拟一个耗时的操作
return value * 2;
}

每次ExpensiveComponent重新渲染(页面刷新或者state变量发生变化)时,expensiveOperation都会被调用,即使someProp没有变化。

使用useMemo的情况:

 import React, { useMemo } from 'react';

function ExpensiveComponent({ someProp }) {
// 使用useMemo来记住之前的expensiveValue
const expensiveValue = useMemo(() => expensiveOperation(someProp), [someProp]);
return (
<div>
{expensiveValue}
</div>
);
}

function expensiveOperation(value) {

console.log('ExpensiveComponent组件刷新时执行") //不打印
// 模拟一个耗时的操作
return value * 2;
}

这里,useMemo用于缓存expensiveOperation的结果。只有当someProp改变时,expensiveOperation才会重新计算,否则它会记住之前的计算结果。这样可以提高性能,特别是当组件依赖于某些昂贵的计算结果时。

3、useMemo和useEffect的相同点和不同点:

相同点:两者都有依赖对象,当依赖对象发生变化时才会执行。

不同点:(1)useMemo在组件渲染时执行(例如在刷新页面的同时执行),useEffect在组件渲染之后执行;
          (2)useEffect用于处理副作用,例如DOM操作,事件处理,接口请求,useMemo适用于需要根据依赖项执行复杂计算的场景,例如根据输入值计算某个结果。它可以避免在每次渲染时都进行计算,提高性能。常见的使用场景包括数据转换、昂贵的计算和优化渲染。

         (3)useMemo返回一个值,useEffect不返回任何值

 

标签:expensiveOperation,ExpensiveComponent,useMemo,someProp,scrollToBottom,react,useE
From: https://www.cnblogs.com/panzai/p/18514141

相关文章

  • 个人学习React Native的实际意义探讨
        ReactNative(以下简称RN)是一个跨平台框架,它是由facebook公司基于React实现的移动端跨平台开发框架。目前比较流行的跨平台开发框架除了RN,还有一个就是Flutter。随着Flutter的兴起和后来居上,使得RN没有前几年那么吃香了。那么除了技术上的比较外,个人学习RN有什么必......
  • Sound Reactor Pro
    SoundReactorPro是一款Unity工具,它简化了在Unity中让事件和属性响应音频和MIDI事件的过程。该插件的核心功能包括:MIDI文件播放:SoundReactorPro支持MIDI文件播放,将MIDI音符事件及其力度值转换为128个音符的频谱,实现对多达128个独立频率的精确控制。音频和M......
  • react hook应用详解+diff 理解 + 父子组件渲染
    文章目录ReactHook函数全解1.useState2.useEffect3.useContext4.useReducer5.useCallback6.useMemo7.useRef8.useImperativeHandle9.useLayoutEffect10.useDebugValueReact渲染更新原理1.虚拟DOM(VirtualDOM)2.协调(Reconciliation)3.批量更新和DOM操作Reac......
  • react数组插入
    1、定义数组:const[items,setItems]=useState([]);2、普通js写法插入:setItems([...items,newItem])但是由于react是异步渲染的,这种更新方式可能会导致渲染不同步3、推荐更新方式:使用setState方法,并提供一个函数,该函数接收先前的状态,并返回一个更新后的状态。constaddIte......
  • Zustand介绍与使用 React状态管理工具
    文章目录前言基本使用编写状态加方法在组件中使用异步方法操作中间件简化状态获取优化性能持久化保存前言在现代前端开发中,状态管理一直是一个关键的挑战。随着应用规模的扩大,组件间的状态共享变得愈加复杂。为了应对这一需求,开发者们逐渐寻找更加轻量、灵活的......
  • 了解React Native应用中的createNativeStackNavigator 组件
    createNativeStackNavigator是ReactNavigation库中的一个组件,专门用于在ReactNative应用中创建原生的堆栈导航器(StackNavigator)。这个组件允许你在应用中实现页面之间的导航,如从主页面跳转到详情页面,然后再返回主页面。与传统的JavaScript堆栈导航器相比,createNat......
  • 尚硅谷-react教程-求和案例-数据共享(下篇)-完成数据共享-笔记
    #1024程序员节|征文# public/index.html<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>redux</title></head><body><divid="root"><......
  • React--》掌握Valtio让状态管理变得轻松优雅
    Valtio采用了代理模式,使状态管理变得更加直观和易于使用,同时能够与React等框架无缝集成,本文将深入探讨Valtio的核心概念、使用场景以及其在提升应用性能中的重要作用,帮助你掌握这一强大工具,从而提升开发效率和用户体验。目录初识ValtioValtio基础使用代理与快照订阅与侦......
  • react 总结+复习+应用加深
    文章目录一、React生命周期1.挂载阶段(Mounting)补充2.更新阶段(Updating)3.卸载阶段(Unmounting)二、React组件间的通信交互1.父子组件通信2.兄弟组件通信三、React页面缓存机制应用1.使用`React.memo`进行组件缓存2.使用`shouldComponentUpdate`进行手动缓存控制3.......
  • React项目搭建
    1.环境准备确保你的计算机上已安装以下工具:Node.js:React需要Node.js来运行和管理依赖。你可以从Node.js官网下载并安装最新版本。npm:Node.js安装后会自带npm(NodePackageManager),用于管理项目依赖。2.创建项目使用CreateReactApp是快速创建React应用的推荐方式。打开终......