memo、 useMemo 和 useCallback语法讲解

2023-12-25 10:12

本文主要是介绍memo、 useMemo 和 useCallback语法讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

memo、 useMemo 和 useCallback

+缓存组件, 对组件浅比较 (只有组件的props, (对函数,引用要用useCallback包裹)发生变化
+缓存值, 依赖项变化,会从新计算。
+缓存函数, 依赖项变化,重新生成新函数

useMemo 语法

对返回的值缓存进行优化


const memoizedValue = useMemo(() => computeExpensiveValue(a, b), deps);
  1. 传入一个函数进去,会返回一个 memoized 值(会记忆的值),需要注意的是,函数内必须有返回值

  2. 第二个参数会依赖值,

类似于computed实时计算

useMemo 优化

我们定义了一个total函数,内部使用 1 填充了100次,通过 reduce 计算总和,经过测试发现点击 Increase按钮后,只会执行 total1 ,不会执行 total2,假设total计算量巨大,就会造成内存的浪费,通过 useMemo 可以帮我们缓存计算值。

function App(){    console.log('Demo1 Parent')    let [count,setCount] = useState(0)    const handleClick = ()=>{        setCount(count+1)    }    const total1 = ()=>{        console.log('计算求和1')        let arr = Array.from({ length:100 }).fill(1)        return arr.reduce((prev,next)=>prev+next,0)    }    // 缓存对象值    const total2 = useMemo(()=>{        console.log('计算求和2')        let arr = Array.from({ length:100 }).fill(1)        return arr.reduce((prev,next)=>prev+next,0)    },[count]) return (        <div>            <div>                <label>Count:{count}</label>             <button onClick={handleClick}>Increase</button>            </div>            <div>                <label>总和:</label>                <span>{total1()}</span>                <span>{total2}</span>            </div>        </div>    )
}
useCallback 语法

对函数缓存进行优化

useCallback(callback, deps)
  1. useCallback 接收 2 个参数,第一个为缓存的函数,第二个为依赖值

  2. 主要用于缓存函数,第二次会返回同样的结果。

useCallback 优化
import { memo, useCallback, useState } from 'react'function App() {const [count, setCount] = useState(0)const handleClick = useCallback(() => {console.log('子节点点击...')}, [])return (<div className='App'><p>欢迎学习React后台课程</p><p><span>Count: {count}</span><buttononClick={() => {setCount(count + 1)}}>按钮</button></p><Child handleClick={handleClick} /></div>)
}const Child = memo(function Child(props: any) {console.log('child...')return (<p>我是子节点 <button onClick={props.handleClick}>按钮</button></p>)
})
useCallback 和 useMemo 区别
  • 他们都用于缓存,useCallback 主要用于缓存函数,返回一个 缓存后 函数,(防止函数重复创建)

  • useMemo 主要用于缓存值,返回一个缓存后的值。(防止值重复计算)

  • memo,防止组件重复创建 (只有组件的props, (对函数,引用要用useCallback包裹)发生变化,组件才会更新.)

这篇关于memo、 useMemo 和 useCallback语法讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/535144

相关文章

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ