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

如何使用useMemo来优化性能

官方定义

useMemo是一个React Hook,它在每次重新渲染的时候能够缓存计算结果

这里包含了两个信息

useMemo作用:缓存计算结果
useMemo生效的时机:重新渲染的时候

那么哪些情况会重新渲染呢?

1、组件的state发生变化
2、传入组件的props发生变化
3、父组件重新渲染

看一下下面这段代码

import React, {useState, useMemo} from 'react';const mock_data = Array(5000000).fill(null).map((_,i)=>({score:i,name: i + '号选手'
}))const UseMemoDemo = () => {const [count, setCount] = useState(0)const sum = () => {console.log('看看触发了没')return eval(mock_data.map(item=>item.score).join('+'))}return (<div><p>count:{count}</p><button onClick={()=>{setCount(count+1)}}>点击加一</button>总分:{sum()}</div>)
}
export default UseMemoDemo;

可以看到当你点击按钮的时候,sum也在持续触发中,此时由于sum中的计算量过大,造成了明显的卡顿现象
用useMemo改造后,如下:

import React, {useState, useMemo} from 'react';const mock_data = Array(5000000).fill(null).map((_,i)=>({score:i,name: i + '号选手'
}))const UseMemoDemo = () => {const [count, setCount] = useState(0)const sum = useMemo(() => {console.log('看看触发了没')return eval(mock_data.map(item=>item.score).join('+'))},[])return (<div><p>count:{count}</p><button onClick={()=>{setCount(count+1)}}>点击加一</button>总分:{sum}</div>)
}
export default UseMemoDemo;

此时,count的变化就影响不到sum了,另外有一点要注意,此时的sum是单纯的一个数值,不是函数,useMemo的返回值是一个计算结果!!
这里看一下useMemo的结构:

const cachedValue = useMemo(calculateValue, dependencies)

一个没有任何参数的 calculation 函数,像这样 () =>,并且返回任何你想要的计算结果。
一个由包含在你的组件中并在 calculation 中使用的所有值组成的 依赖列表。

useMemo缓存的值(cachedValue)就是其第一个参数,即calculateValue函数的返回值
第二个参数是依赖项,类似于useEffect的用法,可以看一下下面的代码

import React, {useState, useMemo} from 'react';const mock_data = Array(50000).fill(null).map((_,i)=>({score:i,name: i + '号选手'
}))const UseMemoDemo = () => {const [count, setCount] = useState(0)const [trigger, setTrigger] = useState(true)const sum = useMemo(() => {if(trigger){return eval(mock_data.map(item=>item.score).join('+'))}else{return "算不出来"}},[trigger])return (<div><p>count:{count}</p><p><button onClick={()=>{setCount(count+1)}}>点击加一</button></p>总分:{sum}<p><button onClick={()=>{setTrigger(!trigger)}}>只有点击我的时候,sum才受影响</button></p></div>)
}
export default UseMemoDemo;

可以看到效果,sum只受到trigger这个状态的影响,其余的状态都不会更新它

相关文章:

  • 基于 Amazon EC2 和 Amazon Systems Manager Session Manager 的堡垒机的设计和自动化实现
  • jsx语言和js语言的区别
  • Cartographer框架简述
  • 【踩坑专栏】主机ping虚拟机失败
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • 人工智能学习与实训笔记(二):神经网络之图像分类问题
  • 单例模式的介绍
  • 鸿蒙自定义侧滑菜单布局(DrawerLayout)
  • 《VitePress 简易速速上手小册》第8章 安全性与部署(2024 最新版)
  • ChatGPT丨成像光谱遥感技术中的AI革命:ChatGPT应用指南
  • Excel练习:双层图表
  • Linux | Ubuntu通过USB访问Redmi K40存储出现xxx was not providedby any .service files错误
  • 机器学习面试:逻辑回归与朴素贝叶斯区别
  • Oracle普通用户启停JOB报错ORA 27486权限不足
  • 【大数据】Flink 之部署篇
  • CODING 缺陷管理功能正式开始公测
  • codis proxy处理流程
  • Debian下无root权限使用Python访问Oracle
  • Git同步原始仓库到Fork仓库中
  • golang中接口赋值与方法集
  • JavaScript实现分页效果
  • 今年的LC3大会没了?
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 浅谈Golang中select的用法
  • 驱动程序原理
  • 三栏布局总结
  • 跳前端坑前,先看看这个!!
  • 新手搭建网站的主要流程
  • 优秀架构师必须掌握的架构思维
  • UI设计初学者应该如何入门?
  • 带你开发类似Pokemon Go的AR游戏
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • !$boo在php中什么意思,php前戏
  • #### go map 底层结构 ####
  • #Linux(帮助手册)
  • #mysql 8.0 踩坑日记
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三十五)大数据实战——Superset可视化平台搭建
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)插入排序
  • (转) 深度模型优化性能 调参
  • (转)jQuery 基础
  • ****Linux下Mysql的安装和配置
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core中的去虚
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net MVC + EF搭建学生管理系统
  • .Net Web项目创建比较不错的参考文章
  • .NET大文件上传知识整理
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET命名规范和开发约定