广告
返回顶部
首页 > 资讯 > 前端开发 > html >如何使用useMemo
  • 864
分享到

如何使用useMemo

2024-04-02 19:04:59 864人浏览 薄情痞子
摘要

本篇内容主要讲解“如何使用useMemo”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用useMemo”吧!作为「性能优化」手段,一般用useMemo缓存

本篇内容主要讲解“如何使用useMemo”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用useMemo”吧!

作为「性能优化」手段,一般用useMemo缓存数组件中比较消耗性能的计算结果:

function App() {   const memoizedValue = useMemo(     () => computeExpensiveValue(a, b),     [a, b]   );   // ... }

只有在依赖项改变后才会重新计算新的memoizedValue。

你有没有想过,如果用useMemo缓存函数组件的返回值,会怎么样呢?

举个例子

我们有个全局context —— AppContext。

由于同学们偷懒,随着项目的迭代,新增的context都选择放在AppContext里,导致AppContext包含的内容越来越多。

现在我们有个Tree组件,他会渲染一个很耗性能的大组件ExpensiveTree。

function Tree() {   let appContextValue = useContext(AppContext);   let theme = appContextValue.theme;    return <ExpensiveTree className={theme} />; }

该组件内部依赖AppContext中的theme状态。

由于AppContext中包含很多与theme无关的state,导致每次其他无关的state更新,Tree都会重新render,进而ExpensiveTree组件也重新render。

现在这个优化任务交到了你手上,该怎么办呢?

优化ExpensiveTree

这时候,useMemo就能派上用场:

function Tree() {   let appContextValue = useContext(AppContext);   let theme = appContextValue.theme;    return useMemo(() => {     return <ExpensiveTree className={theme} />;   }, [theme]) }

我们将返回的ExpensiveTree作为useMemo返回值,theme作为依赖。

这样,即使AppContext改变导致Tree反复render,ExpensiveTree也只会在theme改变后render。

原理解析

要理解这么做有效的原因,需要了解三点:

  1. useMemo返回值是什么

  2. 函数组件的返回值是什么

  3. React组件在什么时候render

回答第一个问题:useMemo会将第一个参数(函数)的返回值保存在组件对应fiber中,只有在依赖项(第二个参数)变化后才会重新调用第一个参数(函数)计算一个新值。

回答第二个问题:函数组件的返回值是jsX对象。

同一个函数组件调用多次,返回的是多个「不同」的JSX对象(即使props未变,但JSX是新的引用)。

按照以上两个回答,我们可以得出结论:

  • 以上useMemo用法实际上在函数组件对应的fiber中缓存了一个完整的JSX对象

第三个问题,函数组件需要同时满足如下条件才不会render:

1 oldProps === newProps

前后两次更新props全等,注意是「全等」。

2 组件context没有变化

3 workInProgress.type === current.type

组件更新前后fiber.type未变化,比如div没有变为p。

4 !includesSomeLane(renderLanes, updateLanes)

当前fiber上不存在更新,或者存在更新但优先级低。

  • 更详细的解释,可以参考这篇文章:React组件到底什么时候render?

当我们不使用useMemo包裹返回值,每次Tree render返回的都是全新的JSX对象。

所以对于ExpensiveTree,oldProps !== newProps。

再看2:ExpensiveTree内部context没变,满足

再看3:ExpensiveTree更新前后type都是ExpensiveTree,满足

再看4: ExpensiveTree内没有状态更新,满足

所以,当我们使用useMemo包裹ExpensiveTree后,当theme不变,每次Treerender后返回的都是同一个JSX对象,满足第一条。

基于这个原因,ExpensiveTree不会render。

到此,相信大家对“如何使用useMemo”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 如何使用useMemo

本文链接: https://www.lsjlt.com/news/83800.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用useMemo
    本篇内容主要讲解“如何使用useMemo”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用useMemo”吧!作为「性能优化」手段,一般用useMemo缓存...
    99+
    2022-10-19
  • react中的useMemo怎么使用
    今天小编给大家分享一下react中的useMemo怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。概念react 中是...
    99+
    2023-07-04
  • React useMemo和useCallback的使用情景
    这篇文章主要讲解了“React useMemo和useCallback的使用情景”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React useMemo和useCallback的使用情景”吧...
    99+
    2023-06-14
  • React useMemo和useCallback的使用场景
    目录useMemouseCallback useMemo 我们知道当父组件发生重新渲染时,其所有(状态、局部变量等)都是新的。一旦子组件依赖于父组件的某一个对象变量,那么无论对象是否...
    99+
    2022-11-12
  • React.memo和useMemo的使用问题小结
    目录问题背景useMemo 进行优化React.memo 进行优化props的值是基本类型props的值是引用类型写在最后问题背景 大家在使用 React 框架进行开发时一定遇到过以...
    99+
    2022-11-13
    React.memo useMemo React.memo useMemo使用
  • React 正确使用useCallback useMemo的方式
    目录正确使用useCallback useMemo的姿势useCallbackuseMemo总结正确使用useCallback useMemo的姿势 说起useCallback us...
    99+
    2022-11-13
    React 使用useCallback useMemo方式 React  useCallback useMemo
  • React中memo、useCallback和useMemo的使用场景是什么
    这篇“React中memo、useCallback和useMemo的使用场景是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2023-07-05
  • 如何使用fastcache
    小编给大家分享一下如何使用fastcache,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!VnTrader 2.0版本有不少提速措施,其中lru_cache是提高...
    99+
    2023-06-02
  • crystaldiskinforh如何使用
    这篇文章主要介绍“crystaldiskinforh如何使用”,在日常操作中,相信很多人在crystaldiskinforh如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2023-02-09
  • Cython如何使用
    这篇文章主要讲解了“Cython如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Cython如何使用”吧!Cython是一个编程语言,它通过类似Python的语法来编写C扩展并可以被P...
    99+
    2023-06-27
  • RPM如何使用
    这篇文章主要介绍了RPM如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇RPM如何使用文章都会有所收获,下面我们一起来看看吧。RPM Package Manager (RPM) 是一个强大的命令行驱动的软...
    99+
    2023-06-27
  • HTTPie如何使用
    今天小编给大家分享一下HTTPie如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。HTTPie 是一个 HTTP 的命...
    99+
    2023-06-28
  • vue.extend如何使用
    本文小编为大家详细介绍“vue.extend如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue.extend如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.Vue.extend的使用参数:对...
    99+
    2023-07-05
  • np.ones如何使用
    这篇文章主要介绍了np.ones如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇np.ones如何使用文章都会有所收获,下面我们一起来看看吧。概述np.ones()函数返回给定形状和数据类型的新数组,其中...
    99+
    2023-07-05
  • np.unique()如何使用
    本篇内容主要讲解“np.unique()如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“np.unique()如何使用”吧!一、np.unique() 介绍对于一维数组或者列表,np.un...
    99+
    2023-07-05
  • MySqlBulkLoader如何使用
    这篇文章主要介绍了MySqlBulkLoader如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySqlBulkLoader如何使用文章都会有所收获,下面我们一起来看看吧。一、MySqlBulkLoad...
    99+
    2023-07-02
  • webpack如何使用
    本篇内容介绍了“webpack如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!webpack介绍和使用一、webpack介绍1、由来由...
    99+
    2023-07-02
  • numpy.insert()如何使用
    这篇文章主要介绍“numpy.insert()如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“numpy.insert()如何使用”文章能帮助大家解决问题。numpy.insert()主要用于...
    99+
    2023-07-05
  • WebComponent如何使用
    本篇内容介绍了“WebComponent如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正文WebComponent 是官方定义的自定...
    99+
    2023-07-05
  • DebugView如何使用
    要使用DebugView,您可以按照以下步骤操作:1. 下载DebugView工具:您可以从Sysinternals Suite官方...
    99+
    2023-09-11
    DebugView
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作