了解 React useMemo Hook

2023-11-10

介绍

随着 React 16.8 的发布,您现在可以在 React 应用程序中使用许多有用的钩子。 16.8 中引入的内置 Hooks 之一是useMemo。该挂钩有可能提高应用程序的性能。

本文将探讨重新渲染在 React 中的工作原理、为什么这是 React 应用程序的一个重要考虑因素,以及如何重新渲染useMemohook 可以利用它来提高应用程序的性能。您还将学到什么时候useMemo可能会导致性能问题。

先决条件

要完成本教程,您将需要:

  • 在开始本教程之前对 React 有基本的了解。您可以通过以下方式了解有关 React 的更多信息如何在 React.js 中编码 series.

引用平等和昂贵的操作

有两个问题useMemo力求解决:

  • 参照平等
  • 计算成本高的操作

在组件的生命周期中,React 在进行更新时重新渲染组件。当 React 检查组件中的任何更改时,由于 JavaScript 处理相等和浅比较的方式,它可能会检测到意外或意外的更改。 React 应用程序中的此更改将导致其不必要地重新渲染。

此外,如果重新渲染是一项昂贵的操作,例如长时间的for loop,它会损害性能。昂贵的操作在时间、内存或处理方面可能代价高昂。除了潜在的技术问题之外,这还可能导致糟糕的用户体验。

如果一个部件重新渲染,它会重新渲染整个组件树。

因此,React 发布了memo解决这个问题的想法。

了解记忆化

记忆化是一种传递要记忆的复杂函数的优化技术。在记忆中,当随后传入相同的参数时,结果就会被“记住”。

如果我们有一个计算函数1 + 1,它将返回2。但如果它使用记忆化,下次我们运行时1是通过函数,不会将它们相加;它只会记住答案是2而不执行添加功能。

来自官方反应文档, useMemo的签名如下所示:

const memoizedValue = React.useMemo(() => computeExpensiveValue(a, b), [a, b]);

useMemo接受一个函数和一组依赖项。

依赖项的作用类似于函数中的参数。依赖项的列表是元素useMemo手表:如果没有变化,函数结果将保持不变。否则,它将重新运行该函数。如果它们没有改变,即使我们的整个组件重新渲染也没关系,该函数不会重新运行,而是返回存储的结果。如果包装的函数很大且昂贵,这可能是最佳的。这是主要用途useMemo.

创建一个useMemo Example

这是一个使用的抽象示例useMemo对于使用两个计算量大的函数的项目数组:

const List = React.useMemo(() => 
  listOfItems.map(item => ({
    ...item,
    itemProp1: expensiveFunction(props.first),
    itemProp2: anotherPriceyFunction(props.second) 
  })), [listOfItems]
)

在上面的例子中,useMemo函数将在第一次渲染时运行。它会阻塞线程,直到昂贵的函数完成,如useMemo在第一个渲染中运行。

最初,这看起来不像useEffect, since useEffect可以渲染加载旋转器,直到昂贵的函数完成并且效果触发。

然而,在后续渲染中,只要满足以下条件,昂贵的函数就不需要再次运行listOfItems从未改变。useMemo会“记住”每个函数的返回值。

这将使这些昂贵的功能看起来是瞬时呈现的。如果您有一两个昂贵的同步函数,那么这是理想的选择。

何时使用useMemo

先写代码,然后再看是否可以优化。如果你实施useMemo在应用程序中经常出现这种情况可能会损害性能。

当寻求实施时useMemo,您可以使用分析工具进行检查以识别昂贵的性能问题。昂贵的意味着它正在消耗大量资源(例如内存)。如果您在渲染时在函数中定义了大量变量,则使用 memoize 是有意义的useMemo.

使用正确的钩子完成工作

此外useMemo,还有useCallback, useRef, and useEffect.

The useCallback钩子类似于useMemo,但它返回一个记忆函数,而useMemo有一个返回值的函数。

如果未提供依赖项数组,则无法记忆,并且它将在每次渲染时计算一个新值。你可以使用useRef在这种情况下挂钩。优势useMemo优惠超过useRef如果依赖关系发生变化,则需要重新记忆。

你不会想拥有useMemo触发任何副作用或任何异步调用。在这些情况下,您应该使用useEffect.

结论

本文探讨了useMemohook 以及何时适合在 React 应用程序中使用它。

useMemo可以通过“记住”昂贵的功能并防止每次应用程序发生更改时重新渲染来提高应用程序的性能。

虽然使用此钩子可以提高性能,但如果过度使用它,它也会降低应用程序的速度。使用钩子的次数越多,应用程序分配的内存就越多。

要了解有关 React 最佳实践的更多信息,请遵循完整的如何在 React.js 中编码DigitalOcean 上的系列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 React useMemo Hook 的相关文章

  • 在 Ubuntu 20.04 上安装 ONLYOFFICE 文档

    ONLYOFFICE Docs 是一个根据 AGPLv3 许可证分发的开源办公套件 它允许处理办公文档 电子表格和演示文稿 以及可填写的表格 您可以将其另存为 PDF 文件 该套件使用 DOCX XLSX 和 PPTX 作为核心格式 保证与

随机推荐

  • 如何在 CentOS 8 上安装 VirtualBox 来宾添加

    虚拟盒子是开源的跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 VirtualBox 提供了一组驱动程序和应用程序 VirtualBox Guest Additions 可以安装在来宾操作系统中以扩展来宾操作系统的功能 例如共享文
  • 如何在Linux中检查监听端口(正在使用的端口)

    在对网络连接或特定于应用程序的问题进行故障排除时 首先要检查的事情之一应该是系统上实际使用的端口以及哪个应用程序正在侦听特定端口 本文介绍了如何使用netstat ss and lsof命令来找出哪些服务正在侦听哪些端口 这些说明适用于所有
  • 如何在 CentOS 7 上安装 Nginx

    Nginx 发音engine x是一个免费 开源 高性能的 HTTP 和反向代理服务器 负责处理 Internet 上一些最大网站的负载 Nginx 可以用作独立的 Web 服务器 也可以用作反向代理 for Apache和其他网络服务器
  • 如何在 Debian 10 上安装 Anaconda

    Anaconda 是最流行的 Python R 数据科学和机器学习平台 它用于大规模数据处理 预测分析和科学计算 Anaconda 发行版附带 1 500 多个开源数据包 它还包括 conda 命令行工具和名为 Anaconda Navig
  • 如何在 Linux 中更改用户密码

    在本指南中 我们将解释如何在 Linux 中更改用户密码 我们还将向您展示如何强制用户在下次登录时更改密码 这些说明适用于任何 Linux 发行版 包括 Ubuntu Debian 和 CentOS 介绍 在 Linux 中 您可以使用以下
  • 如何在 Ubuntu 18.04 上安装 Elasticsearch

    Elasticsearch 是一个开源分布式全文搜索和分析引擎 它支持 RESTful 操作 允许您实时存储 搜索和分析大量数据 Elasticsearch 是最流行的搜索引擎之一 为具有复杂搜索要求的应用程序 例如大型电子商务商店和分析应
  • 如何在 CentOS 8 上更改主机名

    通常 主机名是在操作系统安装期间设置的 或者在创建虚拟机时动态分配给虚拟机的 您可能需要更改主机名的原因有很多 最常见的是在创建实例时自动设置主机名 本指南介绍了如何在 CentOS 8 上设置或更改主机名 而无需重新启动系统 先决条件 在
  • 如何在 Debian 9 上安装 VLC 媒体播放器

    VLC 是一个免费的开源多媒体播放器 它是跨平台的 可以播放几乎所有多媒体文件以及 DVD 音频 CD 和不同的流媒体协议 本教程介绍如何在 Debian 9 上安装 VLC 媒体播放器 先决条件 您需要以以下身份登录具有 sudo 访问权
  • 如何在 CentOS 8 上安装和配置 Fail2ban

    所有暴露在互联网上的服务器都面临着恶意软件攻击的风险 例如 如果您有一个连接到公共网络的软件 攻击者可以使用暴力尝试来获取对该应用程序的访问权限 Fail2ban 是一款开源工具 可通过监控服务日志中的恶意活动来帮助保护您的 Linux 计
  • 如何在 Debian 10 Linux 上安装 Apache Cassandra

    Apache Cassandra 是一个免费的开源 NoSQL 数据库 不存在单点故障 它提供线性可扩展性和高可用性 而不会影响性能 许多拥有大型活跃数据集的公司都在使用 Apache Cassandra 包括 Reddit NetFlix
  • 如何在 CentOS 8 上安装 Gitea

    Gitea 是一个用 Go 编写的自托管开源 git 服务器 它配备了存储库文件编辑器 项目问题跟踪 用户管理 通知 内置 wiki 等等 Gitea是一个轻量级应用程序 可以安装在功能较弱的系统上 如果您正在寻找内存占用小得多的 Gitl
  • 如何在Ubuntu 20.04服务器上安装Python 3并设置编程环境

    介绍 对于初学者和经验丰富的开发人员来说 Python 编程语言越来越受欢迎 Python 灵活且用途广泛 在脚本编写 自动化 数据分析 机器学习和后端开发方面具有优势 首次发布于 1991 年 其名称的灵感来自英国喜剧团体 Monty P
  • 如何在 Ubuntu 12.04 上添加交换

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • 使用 Kotlin 的 Android 进度条

    在本教程中 我们将使用 Kotlin 在 Android 应用程序中讨论和实现 ProgressBar 什么是进度条 ProgressBar UI 元素用于在应用程序屏幕上显示进度 我们可以使用 ProgressBar 在应用程序屏幕上显示
  • 如何在 Ubuntu 18.04 上设置 OpenVPN 服务器

    本教程的先前版本由以下人员编写贾斯汀 埃林伍德 介绍 当您的智能手机或笔记本电脑连接到不受信任的网络 例如酒店或咖啡店的 WiFi 时 想要安全可靠地访问互联网吗 A虚拟专用网络 VPN 允许您安全地穿越不受信任的网络 就像在专用网络上一样
  • 保护服务器的推荐安全措施

    介绍 大多数时候 您的主要关注点是启动并运行云应用程序 作为设置和部署过程的一部分 在公开可用之前为您的系统和应用程序构建强大而彻底的安全措施非常重要 在部署应用程序之前实施本教程中的安全措施将确保您在基础架构上运行的任何软件都具有安全的基
  • Android TabLayout 和 ViewPager

    在本教程中 我们将在已经实现的 TabLayout 下实现 ViewPagerthis教程 Android TabLayout ViewPager 概述 ViewPagers 用于滑动数据页 它通常与片段结合使用 让我们修改之前教程中的布局
  • 如何在 Apache 上为 Ubuntu 12.04 创建 SSL 证书

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • SQL面试题及答案

    几乎所有面试都会问到SQL面试问题 因为数据库操作在应用中非常常见 SQL 代表结构化查询语言 它是一种用于数据库通信和关系数据库管理的特定领域编程语言 SQL 由用于数据库交互的标准命令组成 例如 SELECT INSERT CREATE
  • 了解 React useMemo Hook

    介绍 随着 React 16 8 的发布 您现在可以在 React 应用程序中使用许多有用的钩子 16 8 中引入的内置 Hooks 之一是useMemo 该挂钩有可能提高应用程序的性能 本文将探讨重新渲染在 React 中的工作原理 为什