react教程,如何使用useMemo缓存函数运算结果?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
react
项目的函数式组件中,有很多useXxx
系列函数,每个函数都有其特殊的作用。本文描述useMemo
函数,它是用来缓存函数的执行结果的,效果就是:可以不执行函数计算直接拿到上次的缓存结果。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述react
函数式组件的useMemo
函数。测试环境:create-react-app@5.0.1
,react@18.2.0
,react-dom@18.2.0
,node@16.14.2
。
useMemo
useMemo
函数:
- 第一个参数:
()=> value
,没有形参,返回一个value
。 - 第二个参数:依赖
[m,n]
。只有当依赖变化时,才会计算新的value
。
let aa = useMemo(()=>{
return value;
},[m,n]);
测试代码
使用useMemo
的代码范例,如下:
import React, { useState, useMemo } from 'react';
function Child(props) {
let [info, setinfo] = useState({
name: '苏南大叔',
city: 'beijing'
})
function getCity(city) {
console.log('getCity');
return city === 'beijing' ? '北京' : '唐山';
}
let city = getCity(info.city);
let status = useMemo((_useless) => {
console.log('getStatus', _useless); // undefined
return city === '北京' ? '在京' : '京外';
}, [info.city]);
return (
<>
<div>
{info.name}在{city},所以状态为{status} <br />
<button onClick={() => {
let name1 = (info.name == "sunan大叔") ? "苏南大叔" : "sunan大叔";
setinfo({ ...info, name: name1 })
}}> 修改姓名,触发位置判断,在京状态无判断 </button>
<br />
<button onClick={() => {
let city = (info.city == "beijing") ? "tangshan" : "beijing";
setinfo({ ...info, city: city })
}}> 修改位置,触发位置判断,在京状态有判断 </button>
</div>
</>
)
}
export default Child;
在这个代码中,定义了一个普通变量,具有两个属性name
和city
。
- 变量
city
来自:函数一getCity()
,根据city
拼音来返city
的中文名字。 - 变量
status
来自:函数二(使用useMemo
的匿名函数),只有依赖项没有发生变化,就不会重新计算返回值。
运行结果
输出的代码逻辑为:
{info.name}在【{city}】,所以状态为【{status}】
注意:被useMemo
的getStatus
函数的依赖项目为info.city
,只有info.city
被修改后,getStatus
函数才会被重新计算。
第一步,初始化
上述代码初始预算值为:
苏南大叔在【北京】,所以状态为【在京】
console
的默认输出值为:
getCity
getStatus undefined
可见,两个函数都被执行了。
第二步,点击第一个按钮
按钮一修改了info
状态的name
属性,并没有修改info.city
。所以,city
变量重新计算了(输出getCity
)。而status
变量是useMemo
的,依赖项目info.city
没有发生变化,所以没有重新计算输出值(没有输出getStatus
)。
sunan大叔在【北京】,所以状态为【在京】
因为只执行了没有用到usememo
的getCity()
函数,所以console
的输出值为:
getCity
第三步,点击第二个按钮
按钮二修改了info
状态的city
属性,所以city
变量和status
变量都重新计算了,输出getCity
和getStatus
。
sunan大叔在【唐山】,所以状态为【京外】
因为也执行了用到usememo
的getStatus()
函数,所以console
的输出值为:
getCity
getStatus undefined
useMemo
对比memo
useMemo
是个用于函数式组件的缓存函数。memo
主要用于缓存组件本身的(虽然主要用于函数式组件,但是也可以用于类组件),类似于类组件的PureComponent
。
相关文章
- https://newsn.net/say/react-memo.html
- https://newsn.net/say/react-useref.html
- https://newsn.net/say/react-usestate.html
- https://newsn.net/say/react-pure-component.html
- https://newsn.net/say/react-useeffect.html
结束语
更多react
经验文章,请点击苏南大叔的经验文章:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。