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

React中useMemo和useCallback的区别

一句话来解释,useMemo是缓存值的,useCallback是缓存函数的。
一、useMemo:

接收两个参数,第一个参数是个函数,第二个是依赖项。返回一个memoized值,只有当它的某个依赖项改变时才重新计算 memoized 值,初始化的时候也会调用一次,这种优化有助于避免在每次渲染时都进行高开销的计算。

import React, { useState, useMemo } from 'react';export default function hook() {const [count, setCount] = useState(1)const [total, setTotal] = useState(1)const memoizedValue = useMemo(() => {console.log("只有total变了我才会变")// 返回的值是total+1return total + 1}, [total]);return (<div><button onClick={() => setCount(count + 1)}>count + 1</button><button onClick={() => setTotal(total + 1)}>total + 1</button><div>count is {count}</div><div>total is {total}</div><div>memoizedValue is {memoizedValue}</div></div>)
}

二、useCallback

接收两个参数,第一个参数是个函数,第二个是依赖项。返回一个memoized函数,依赖项不变的情况下,memoizedCallback的引用不变。即:useCallback会被缓存,从而达到渲染性能优化的目的。

父组件:

export default function LearnUseCallBack() {const [num, setNum] = useState(1);const [count, setCount] = useState(1);const add = useCallback(() => {console.log("你好");setNum(num + 1);}, [count]);return (<div><div>缓存函数</div><button onClick={add}>num + 1</button><button onClick={() => setCount(count + 1)}>count + 1</button>num ==> {num}count ==> {count}<ChildComponent add={add}></ChildComponent></div>);
}

子组件:

import React, { useState, useCallback } from "react";// react.memo会做一层浅比较/*** 因为我们每次触发render 都会重新执行一遍当前函数* 所以说,我们的方法会重新赋值,react.memo时进行浅比较* 重新赋值的方法和之前的方法,引用不一样,所以react.memo* 会认为是一个新的对象,所以会重新渲染*/
const ChildComponent = React.memo((props) => {console.log("每次render都会触发吗?", props);return (<div><div>你好我是子组件</div></div>);
});

注:若add方法不被缓存,因为add是引用类型,则组件刷新时add函数每次渲染时都指向不同的引用类型,若将add传给子组件,即使子组件使用了memo包裹,子组件还是每次都会刷新的,影响性能!我们只希望与子组件相关的值变化了之后子组件才去重新渲染。

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

相关文章:

  • SpringBoot 快速实现IP地址解析
  • 亚马逊、速卖通,阿里国际等平台测评如何用自养号测评补单
  • ubuntu挂载ext4文件系统
  • MySQL 读写分离
  • 【多线程例题】顺序打印abc线程
  • WebSocket工具类
  • Linux 的 crontab
  • 十二.Redis模拟集群搭建
  • IDEA导入微服务项目后自动将微服务展示在service面板中
  • MySQL体系结构及执行过程
  • 21. MySQL基础知识
  • 【ArcGIS Pro微课1000例】0029:绘制全球海洋波纹荡漾效果图
  • 2023“钉耙编程”中国大学生算法设计超级联赛(3)8-bit Zoom
  • 【PWN · ret2text | 伪rand()】[HDCTF 2023]pwnner
  • 第五章:通过对抗擦除的目标区域挖掘:一种简单的语义分割方法
  • 自定义view - 玩转字体变色
  • 工业边缘网关HiWoo Box的4G/5G CPE功能:为现场无线设备提供网络
  • Set 和 Map 数据结构
  • nginx根据url参数动态代理
  • TCP协议(收集和记录)
  • 【Kafka】自动提交偏移量和手动提交偏移量的区别
  • 缠论线段的划分
  • 【Linux】Ubuntu基本使用与配置, 以及常见问题汇总(一)
  • 【UE5 多人联机教程】02-开始游戏菜单控件
  • 设计模式-工厂方法模式
  • 【Hammerstein模型的级联】快速估计构成一连串哈默斯坦模型的结构元素研究(Matlab代码实现)
  • 「C 语言」extern关键字
  • oracle单个用户最大连接数限制
  • 计算机网络最基础知识介绍
  • 接口测试进阶之数据模板