Day8:浅谈useMemo

红牛战神
• 阅读 332
目标: 持续输出!每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。

Day8-今日话题

useMemo 是 React 中一个有力的性能优化Hook。可从用法工作原理作用优缺点使用场景使用注意点进行学习、复习。

拿vue作比较的话,功能可以类比成vue的计算属性computed,都是因为依赖项发生变化而进行重新计算。

1. 用法

useMemo 是 React 中的一个 Hook,用于缓存计算结果,以减少不必要的计算和渲染。它接受两个参数:

  • 一个函数,用于计算需要缓存的值。
  • 一个依赖数组,包含了在数组中列出的变量发生变化时才重新计算值,可以为空数组或包含多个依赖。
const memoizedValue = useMemo(() => computeExpensiveValue(dep1, dep2), [dep1, dep2]);

2. 工作原理

useMemo 的工作原理涉及到 React 的渲染过程和依赖数组的比较,下面详细介绍其工作原理:

  1. 组件的初始渲染和依赖项变化时

    • 当一个组件首次渲染时或其依赖项发生变化时,React 会执行组件函数内的所有代码,包括 useMemo
    • useMemo 中,第一个参数是一个计算函数。React 调用这个函数,计算并返回一个值,同时将这个值存储在内部。
    • React 还会将依赖数组(useMemo 的第二个参数)的内容记录下来。
  2. 比较依赖项

    • 当组件重新渲染时,React 会再次执行组件函数,包括 useMemo
    • 在这个阶段,React会比较当前的依赖数组和上一次渲染时存储的依赖数组。
  3. 重新计算或复用

    • 如果当前的依赖数组和上一次的依赖数组完全相同(即每个元素都严格相等),React 会认为依赖项没有变化,不会重新计算 useMemo 的结果。
    • 如果当前的依赖数组和上一次的依赖数组不相等,React 将重新调用 useMemo 中的计算函数,计算并返回新的值。
    • 如果依赖数组为空([]),则 useMemo 的结果只会在组件首次渲染时计算一次,并且永远不会重新计算。
  4. 返回计算结果

    • 无论是重新计算还是复用,useMemo 的最终结果都将返回给组件,可以在组件中使用。

这个工作原理确保了 useMemo 只在其依赖项发生变化时才会重新计算,从而有效地避免了不必要的计算和渲染。这对于优化性能和确保组件的一致性非常重要。

需要注意的是,useMemo 返回的是缓存的值,而不是一个函数。如果需要缓存一个函数,可以使用 useCallback。此外,useMemo 的依赖数组应该包含所有在计算函数中使用的变量,以确保在依赖项变化时重新计算。

3. 作用

  • 性能优化useMemo 可以用于缓存昂贵的计算,避免不必要的重新计算,从而提高性能。
  • 避免不必要的渲染:通过将 useMemo 的结果用作子组件的 prop,可以避免子组件在不必要的情况下重新渲染。
  • 缓存引用类型:可以缓存引用类型(如对象或数组),以避免在每次渲染时都创建新的引用。

4. 优点

  • 性能优化:最明显的优点是帮助优化性能,避免不必要的计算和渲染。
  • 可读性:通过明确指定依赖,代码变得更加可读和可维护。

5. 缺点

  • 滥用可能导致性能问题:过度使用 useMemo 可能会导致性能问题,因为它可能导致不必要的内存占用。应该谨慎选择使用它,只在需要缓存计算结果时才使用。
  • 复杂性增加:如果依赖数组包含多个变量,维护这些依赖可能会增加代码复杂性。

6. 使用场景

  • 计算结果昂贵:用于缓存计算成本高昂的值,例如数学计算、数据筛选、数据转换等。
  • 避免不必要的渲染:将 useMemo 的结果用作子组件的 prop,以确保子组件只在必要时重新渲染。
  • 缓存引用类型:当需要在多次渲染之间保持相同的引用类型时,可以使用 useMemo

通俗来讲就是说,当前组件或者当前组件所在的父组件修改状态(state)时,我们不想让其 render 函数中的某个节点或者自身因为不相关的状态变化而去重新渲染造成性能上的浪费,可以使用useMemo来解决这个问题。

7.使用注意点

使用 useMemo 时需要注意以下几个重要的方面:

  1. 性能优化的平衡:不要滥用 useMemo。只有在有昂贵的计算或大型引用类型传递给子组件时,才考虑使用它。过度使用 useMemo 可能会导致不必要的复杂性和性能问题。
  2. 正确选择依赖项:确保依赖数组包含了所有在计算函数中使用的变量。如果忘记包含某个依赖,可能导致缓存的值不会在依赖变化时重新计算。
  3. 依赖项是否需要深层比较:注意依赖项是否是引用类型(如对象或数组)。如果依赖项是引用类型,它们的内容可能在地址不变的情况下发生变化。在这种情况下,你可能需要自行处理深层比较,以确保正确触发重新计算。
  4. 避免不必要的内存占用:虽然 useMemo 可以用于缓存引用类型,但要小心不要在不需要的情况下缓存大型对象或数组,以避免不必要的内存占用。在某些情况下,直接传递引用类型的变化可能更合适。
  5. 记住 useMemo 返回的是值useMemo 返回的是计算的值,而不是函数。如果需要缓存函数,应该使用 useCallback
  6. 性能监控工具:使用性能监控工具(如 React DevTools)来检查 useMemo 缓存的值是否按预期工作。这有助于排除性能问题和调试问题。
  7. 组件层次结构考虑useMemo 只在当前组件内有效。如果需要在多个组件之间共享缓存值,可能需要提升状态或使用上下文(Context)。

欢迎点赞、关注、转发~
Day8:浅谈useMemo

本文由mdnice多平台发布

点赞
收藏
评论区
推荐文章
巴拉米 巴拉米
4年前
前端性能优化
为什么要做性能优化?性能优化有多重要?网站的性能对于用户的留存率、转化率有很大的影响,直白的说,提高网站的性能可以直接提高网站带来的收益。性能优化的分类前端的性能优化主要分为两类:1.加载时优化;2.运行时优化;例如压缩文件、使用CDN加载静态资源属于加载时优化;及时的解绑事件、减少DOM的操作属于运行时优化。吉
Souleigh ✨ Souleigh ✨
4年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
3年前
React Hooks实现异步请求实例—useReducer、useContext和useEffect代替Redux方案
<blockquote本文是学习了2018年新鲜出炉的ReactHooks提案之后,针对<strong异步请求数据</strong写的一个案例。注意,本文假设了:<br1.你已经初步了解<codehooks</code的含义了,如果不了解还请移步<ahref"https://reactjs.org/docs/hooksintro.html
Wesley13 Wesley13
3年前
Java面试
<divclass"htmledit\_views"id"content\_views"<pid"maintoc"<strong目录</strong</p<pid"Java%E5%9F%BA%E7%A1%80%EF%BC%9Atoc"style"marginleft:40px;"<ahref"Java%E5%
Wesley13 Wesley13
3年前
Java Web 前端高性能优化(二)
一.上文回顾上回我们主要从图片的合并、压缩等方面介绍前端性能优化问题(详见JavaWeb前端高性能优化(一)(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fclub.oneapm.com%2Ft%2Fjavaweb%2F399))本次我们主要从图像BASE64
Stella981 Stella981
3年前
JavaScript 性能优化技巧分享
JavaScript作为当前最为常见的直译式脚本语言,已经广泛应用于Web应用开发中。为了提高Web应用的性能,从JavaScript的性能优化方向入手,会是一个很好的选择。本文从加载、上下文、解析、编译、执行和捆绑等多个方面来讲解JavaScript的性能优化技巧,以便让更多的前端开发人员掌握这方面知识。什么是高性能的JavaScr
Easter79 Easter79
3年前
Tomcat安装、配置、优化及负载均衡详解
<divid"cnblogs\_post\_body"class"blogpostbody"<p<strong原文地址:https://www.cnblogs.com/rocomp/p/4802396.html</strong</p<p<strong一、常见JavaWeb服务器</strong</p<div<strong&
Wesley13 Wesley13
3年前
Oracle SQL 性能优化40条,必看!
点击上方“杰哥的IT之旅”,选择“置顶公众号”干货、福利第一时间送达!!(https://oscimg.oschina.net/oscnet/f852096f754e4695a4b7afa313693f64.gif)!(https://oscimg.oschina.net/oscnet/5778db0cde9
聊聊前端性能指标那些事儿
作为C端前端研发,除了攻克业务难点以外,也要有更深层的自我目标,那就是性能优化。这事儿说大不大,说小也不小,但难度绝对不一般,所涉及的范围优化点深入工程每个细胞。做好前端性能优化绝非简单之事!文章主要内容介绍前端性能考核指标及优化方案。
实践指南-前端性能提升 270% | 京东云技术团队
本文详细介绍了一个前端项目优化的详细过程,从优化前的问题分析,到具体的优化措施,最终实现了前端性能提升了近3倍。同时也将性能指标落到监控平台,实现可视化的监控前端性能指标。
23年通天塔搭建页前端性能优化阶段分享
前言通天塔搭建页项目是用来搭建各类活动页面,比较老且业务复杂的项目,可优化点还是非常多的。今年侧重对运营页首屏加载的性能优化,在保证系统稳定可控、需求持续迭代前提下,最终提升了58.8%速度。在此非常感谢通天塔产品组、后端组、前端组同学,对项目性能优化大力