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项目调试记录

相关内容

热门资讯

三月三上巳节习俗【最新3篇】 三月三上巳节习俗 篇一三月三上巳节是中国传统的节日,也是一个重要的祭祀节日。它起源于古代中国的巫师文...
我初三作文【优秀6篇】 我初三作文 篇一我的初三生活初三,对于每个初中生来说,都是一个非常重要的一年。也许有些人会觉得初三只...
旅游作文(优秀3篇) 旅游作文 篇一探索自然奇观的旅程我最近参加了一次令人难忘的旅行,去了一个被誉为自然奇观的地方。这个地...
关于做文明人的作文初三(优选... 关于做文明人的作文初三 篇一作文题目:文明礼仪,从我做起文明是一种素养,礼仪是一种传统,做文明人是每...
初三作文训练(实用6篇) 初三作文训练 篇一:我的暑假计划暑假即将来临,作为初三的学生,我对这个暑假充满了期待。虽然暑假是休息...
丢作文600字初三(优选6篇... 丢作文600字初三 篇一寻找失落的灵感初三的作文,对于我来说,是一道难以逾越的坎。一直以来,我都能轻...
遇见未来的人初三优秀作文65... 篇一:遇见未来的人在一个晴朗的早晨,我骑着自行车沿着小路向学校的方向驶去。突然,我的眼前出现了一个奇...
我的初三我的梦作文600字【... 我的初三我的梦作文600字 篇一初三是我人生中非常重要的一年,也是我梦想开始逐渐明确的一年。在这一年...
迟了一分钟初三作文(优选3篇... 迟了一分钟初三作文 篇一我迟到了一分钟我是一个非常守时的人,从小到大,几乎没有迟到过。然而,上周五的...
初三作文指导课教案(精简3篇... 初三作文指导课教案 篇一标题:如何写好记叙文第一部分:引入引入学生对记叙文的理解,并激发学生对记叙文...
聆听自然作文600字初三作文... 聆听自然作文600字初三作文 篇一:感受大自然的力量自然是一位伟大而慈爱的母亲,她给予我们生命的力量...
写初三的幸福作文500字【精... 写初三的幸福作文500字 篇一初三,是每个中学生都经历的一段特殊时光。这一年,我们面临着升学的考验,...
初三一个自强不息的自己作文(... 初三一个自强不息的自己作文 篇一初三是人生中一个重要的阶段,是我们迈向高中的起点。在这个阶段,我遇到...
写给老师、同学初三作文(优选... 写给老师、同学初三作文 篇一尊敬的老师、亲爱的同学:初三的学习生活即将结束,回顾这段时光,我有很多话...
《极地特快》观后感(优质6篇... 《极地特快》观后感 篇一《极地特快》是一部由美国电影公司制作的动画电影,讲述了一群动物们在北极的冒险...
考试失利作文范文初三【精彩6... 考试失利作文范文初三 篇一考试失利,是每个学生都可能会遇到的情况。然而,如何应对考试失利,却是一个需...
写初三的幸福作文600字【优... 写初三的幸福作文600字 篇一初三的幸福初三是人生中一个特殊的阶段,对于我们初中生来说,这一年是人生...
如果我有一只画笔初三作文【精... 如果我有一只画笔初三作文 篇一如果我有一只画笔如果我有一只画笔,我会如何运用它的魔力呢?我会画出自然...
我看诸葛亮 初三作文【通用3... 我看诸葛亮 初三作文 篇一诸葛亮是我最敬佩的历史人物之一。他是刘备的重要谋士,也是中国古代历史上最杰...
初三交响曲作文(精简5篇) 初三交响曲作文 篇一初三交响曲作文初三是我人生中一段重要的时光,仿佛是一支交响乐曲,有着高潮迭起的节...