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

04-useMemo 、React.memo、useCallback

useMemo 、React.memo、useCallback

一、useMemo 基本用法

缓存数据,模拟 Vue 中的计算属性。

同样useMemo跟vue中component一样,也是有缓存的,会将结果缓存下来

import React, { useMemo, useState } from 'react';export default function UseMemo() {const [count, setCount] = useState(0);缓存 sum 的值useMemo  使用的时候,第二个参数是个数组,里面必须要传递所依赖的值,才可实现计算属性的功能例如上面此生依赖count 那么就需要把 count传递到数组里面去注意:1、如果第二个参数不传递,useMemo也能执行,也会实现技术属性的效果,但是建议还是传递,这样会更加准确一点2、如果依赖了两个值 比如:number1  number,但是数组里面只传递number1的话 如果number2 也发生变化 此时useMemo是不会执行的,因为没有传递number2告诉useMemo依赖了它就是说const sum = useMemo(() => {return count + count;}, [count]) return (<><p>父组件:{sum}</p><button onClick={() => setCount(count + 1)}>+1</button></>)
}
第一个参数(回调函数)第二个参数(依赖)
1.组件首次渲染(函数首次执行),DOM挂载前执行;2.每次组件更新前(函数重新执行),先执行useMemo,再更新DMO
1.组件首次渲染(函数首次执行),DOM挂载前执行[]
1.组件首次渲染(函数首次执行),DOM挂载前执行;2.每次依赖更新时,每次组件更新前(函数重新执行),先执行useMemo,再更新DMO[sate]

二、React.memo()

在 React 中,默认情况下,父组件更新时,无论子组件是否发生改变,子组件也会更新。

但是,我们更希望:只要子组件用到的数据没有发生改变,即使父组件更新,子组件也不更新。

我们可以用 React.memo 把子组件包裹起来:

function Child(props) {}
export default React.memo(Child);

React.memo :

1、可以用来缓存组件:memo 方法会去判断子组件中的数据(state、props)是否发生改变,只有真正当子组件内部的数据发生改变时,子组件才会更新。

2、但是如果传递给子组件中的值有函数的情况,父组件更新,无论子组件中props的值没变化依旧会触发子组件的更新,是因为:在react函数组件中,父组件值变化,会全部更新父组件,那么就相当于传递给子组件的函数在更新的时候重新被创建了,所以React.memo此时就会检测到props中的函数发生了变化,正常触发子组件的更新。所以useCallback这个hook的作用就体现出来了 详见下面第三点

三、useCallback

useCallback 用来缓存函数。基本语法如下:

import React, { useCallback } from 'react';export default function UseMemo() {const sayHello = () => {console.log('hello')}const cbSayHello = useCallback(sayHello, [])return (// ...)
}

为什么需要缓存函数呢,这个就和 React.memo() 有关系了。

我们用 React.memo() 包裹子组件,是希望子组件能够避免一些不必要的更新。但是,如果父组件传递的 props 是一个函数,那么每次父组件重新渲染时,memo 都会判断 props 的函数是一个新的函数,因此就会更新子组件。

所以这个时候,我们就可以在父组件中通过 useCallback() 将函数缓存下来,再将缓存后的函数传递给子组件。

import React, { useCallback } from 'react';export default function UseMemo() {const sayHello = () => {console.log('hello')}const cbSayHello = useCallback(sayHello, [])return (<Child sayHello={cbSayHello}></Child>)
}

这样处理后,即使父组件发生改变,只要子组件中用到的数据或方法没有变,子组件都不会更新。

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

相关文章:

  • windows下安装emqx Unable to load emulator DLL@if ===/ SET data_dir=“
  • Redis常见问题(未完待续)
  • 2024秋招BAT核心算法 | 详解图论
  • 凝聚共识,锚定未来 | 第四届OpenI/O 启智开发者大会NLP大模型论坛成功举办!
  • 99.【Git】
  • Linux驱动交叉编译把驱动文件放入开发板,以及printk函数打印级别
  • 力扣(LeetCode)433. 最小基因变化(2023.03.07)
  • 网络基础(2)
  • 掌握Spring Cloud Gateway:构建高性能API网关的原理和实践
  • NAST概述
  • 【JS知识点】——原型和原型链
  • c盘怎么清理到最干净?有什么好的清理方法
  • day26_HTML
  • 深度剖析C语言预处理
  • 【WPF 值转换器】ValueConverter 进阶用法
  • Vue2的基本使用
  • 【云原生kubernetes】k8s数据存储之Volume使用详解
  • SerDes---CDR技术
  • 如何实现在on ethernetPacket中自动回复NDP response消息
  • CSS清楚浮动
  • HTTPS详解(原理、中间人攻击、CA流程)
  • EventLoop机制
  • 倒立摆建模
  • SpringSecurity支持WebAuthn认证
  • 深度学习技巧应用3-神经网络中的超参数搜索
  • 【信号量机制及应用】
  • 围棋高手郭广昌的“假眼”棋局
  • 学成教育-统一异常处理实现
  • JNI内通过参数形式从C/C++中传递string类型数据至Java层
  • 自动化测试——执行javaScript脚本