useCallback 与 useMemo 的区别 作用
创始人
2024-06-01 20:02:08
0

useCallback 缓存钩子函数,useMemo 缓存返回值(计算结果)

TS声明如下:type DependencyList = ReadonlyArray;function useCallback any>(callback: T, deps: DependencyList): T;function useMemo(factory: () => T, deps: DependencyList | undefined): T;

一些文章长篇大论解释,其实直接看 typescript 声明就知道作用了,泛型 T 在 useCallback 中是一个钩子函数,在 useMemo 中是一个返回值。

demo示例

一个简单计数器 demo 解释全部作用:点击按钮 count 加 1,同时显示这个数是奇数还是偶数

不用 hook 的代码

import React, { FC, useCallback, useMemo, useState } from 'react';const Index: FC = (props) => {const [count, setCount] = useState(0);const isEvenNumber = count % 2 === 0;const onClick = () => setCount(count + 1);return (
{count} is {isEvenNumber ? 'even':'odd'} number
); };

使用 hook 后的代码

import React, { FC, useCallback, useMemo, useState } from 'react';const Index: FC = (props) => {const [count, setCount] = useState(0);const isEvenNumber = useMemo(() => {return count % 2 === 0;}, [count]);const onClick = useCallback(() => {setCount(count + 1);}, [count]);return (
{count} is {isEvenNumber ? 'even':'odd'} number
); };

看起来没有什么区别,甚至使用 hook 后代码还变复杂了。这个 demo 比较简单,所有使用 hook 后的优化效果不明显,大部分代码即使使用第一种写法都没有太大区别,用户无感知,但系统逐步升级后为了占用更小的内存、更流畅的使用体验 hook 是必要的。

作用

如果不使用 hook,每次组件 re-render 的时候,都需要重新计算 isEvenNumber 的值,以及 new 一个 onClick 函数,即使每次计算结果没有改变,也要重复这个浪费内存的操作,hook 可以缓存相关结果,避免重复渲染时的无效计算。

useCallback 和 useMemo 的参数都是一个函数加一个依赖数组,依赖没有改变时直接返回内存中缓存的结果,无需重复计算。简单理解就是 useCallback 缓存事件处理函数,useMemo 缓存二次计算的结果,如上面的点击事件,以及通过 count 值判断奇数偶数的二次计算结果。

本质原因

React 的函数组件是非常好用的东西,相比 class 写法以及 Vue 的对象挂载写法简洁很多,代码测试复用成本低,容易入手,但也带来一些问题,无状态函数很理想,但现实有一些计算开销大、组件渲染频繁的场景是需要状态的,每次都计算一遍状态(callback 和 二次计算值)无疑很浪费内存,函数不像对象(React class 写法或者 Vue 组件写法)可以直接将状态挂载在自身,没有浪费内存的问题,要实现类似的效果只能找一个的内存挂载点挂载这些东东,所以有了 useCallback 和 useMemo 这些 hook。

useCallback和useMemo的区别

  • 相同点:
    1. useCallback 和 useMemo 参数相同,第一个参数是函数,第二个参数是依赖项的数组。
    2. useMemo、useCallback 都是使参数(函数)不会因为其他不相关的参数变化而重新渲染。
    3. 与 useEffect 类似,[] 内可以放入你改变数值就重新渲染参数(函数)的对象。如果 [] 为空就是只渲染一次,之后都不会渲染
  • 区别:
    • 主要区别是 React.useMemo 将调用 fn 函数并返回其结果,而 React.useCallback 将返回 fn 函数而不调用它。

上一篇:Java反射详解

下一篇:Paddle项目调试记录

相关内容

热门资讯

春季期开学典礼发言稿 春季期开学典礼发言稿(通用5篇)  在充满活力,日益开放的今天,我们总不得不需要用到发言稿,发言稿具...
活动主持稿 活动主持稿15篇  在学习、工作生活中,我们都不可避免地要接触到主持稿,主持稿是主持人于节目进行过程...
运动会稿件 运动会稿件(精选15篇)  昔日环形的跑道,此时在你脚下却幻化为最美的彩虹。你就像一阵风,留给世界的...
证婚人讲话稿 证婚人讲话稿(通用10篇)  随着社会一步步向前发展,我们可以使用讲话稿的机会越来越多,讲话稿是讲话...
地理必修1《河流地貌的发育》... 人教版地理必修1《河流地貌的发育》说课稿  一、说教材  1.教材分析  本节课是位于人教版地理必修...
《植物妈妈有办法》说课稿 《植物妈妈有办法》说课稿(精选13篇)  作为一名老师,通常会被要求编写说课稿,说课稿有助于提高教师...
我是人民教师朗诵稿 我是人民教师朗诵稿范文(精选12篇)  在日常的学习中,大家一定没少看到经典的朗诵稿吧,朗诵是一种比...
《大灰狼开心了》说课稿 《大灰狼开心了》说课稿  一、 说教材  《大灰狼开心了》是我们这个学期教学计划里面高高兴兴主题中的...
《站立式起跑》说课稿 小学四年级体育《站立式起跑》说课稿(精选3篇)  作为一名无私奉献的老师,常常需要准备说课稿,借助说...
重庆小山峡导游词 重庆小山峡导游词  巫山小小三峡是位于大宁河滴翠峡处的支流马渡河上,是长滩峡、秦王峡、三撑峡的总称;...
高中新学期国旗下讲话稿 高中新学期国旗下讲话稿范文(精选6篇)  在充满活力,日益开放的今天,用到讲话稿的地方越来越多,讲话...
小学一年级数学下册《认识时间... 人教版小学一年级数学下册《认识时间》说课稿  一、教材分析  1、教学内容:人教版义务教育课程标准实...
优秀的保国寺导游词 优秀的保国寺导游词  保国寺是我国江南保存最完好的北宋木结构建筑,是国务院公布的第一批全国重点文保单...
广东省厦门植物园导游讲解词 广东省厦门植物园导游讲解词  现在我们来到西大门也就是植物园的主入口,建园后的多次重建,现大门建于1...
英文导游欢迎词 英文导游欢迎词范文  下面是关于英文的导游欢迎词范文,希望对大家有帮助!  英文导游欢迎词范文一  ...
乔家大院的导游词 乔家大院的导游词  导游词是导游人员引导游客观光游览时讲解词,是导游员同游客交流思想,向游客传播文化...
绍兴鉴湖导游词-浙江导游词 绍兴鉴湖导游词-浙江导游词  作为一名专门引导游客、助人为乐的导游,通常需要用到导游词来辅助讲解,导...
长白山天池奇峰导游词 长白山天池奇峰导游词范文  游客朋友们,下面我向大家介绍雄峙长白山山巅,组成长白山宏大壮丽的雄姿,护...
导游词作文350字左右 篇一大家好!欢迎大家来到敦煌莫高窟,我是你们的张导游,请大家保护它的卫生,不要乱涂乱画,随时注意安全...
青岛花石楼导游词 青岛花石楼导游词  作为一名乐于助人的导游,就难以避免地要准备导游词,导游词不是以一代百、千篇一律的...