首页 > 其他分享 >使用 useMemo、useCallback 和 React.memo 优化 React Render

使用 useMemo、useCallback 和 React.memo 优化 React Render

时间:2022-09-07 00:56:34浏览次数:97  
标签:Render 渲染 useMemo React 备忘录 重新 组件

使用 useMemo、useCallback 和 React.memo 优化 React Render

Photo by Susan Q Yin on 不飞溅

维护有这么多贡献者的代码比我更难,你不同意吗?这是 2022 年我第一次与在前端站点上有很多开发人员的公司合作,你的同事有可能做了一些反模式并使应用程序比以前慢。今天我将分享如何优化 React 应用程序,最流行的方法是使用 使用备忘录 , 使用回调 , 和 反应。备忘录。

什么是 React 中的重新渲染?

在谈论 React 性能时,我们需要关注两个主要阶段:

  • 初始渲染 — 当组件首次出现在屏幕上时发生
  • 重新渲染 — 已经在屏幕上的组件的第二次和任何连续渲染

React 组件什么时候重新渲染自己?

组件重新渲染自身的原因有四个:

  • 状态变化
  • 父(或子)重新渲染
  • 语境变化,
  • 挂钩更改

useMemo 与 useCallback

从根本上说, 使用备忘录 使用回调 是用来帮助我们优化重新渲染的工具。他们通过两种方式做到这一点:

  1. 减少给定渲染中需要完成的工作量。
  2. 减少组件需要重新渲染的次数。

简单解释:

  • 使用备忘录 返回一个记忆值。

    const memo = useMemo(() => fn, deps)

  • 使用回调 返回一个记忆回调

    常量回调 = useCallback(fn, deps)

使用备忘录

我们的应用程序有两种状态, 选定的编号 时间 .每秒一次, 时间 变量被更新以反映当前时间,并且该值用于在右上角呈现数字时钟。

问题来了:无论何时 任何一个 在这些状态变量发生变化时,我们重新运行所有那些昂贵的素数计算。而且因为 时间 每秒改变一次,这意味着我们不断地重新生成素数列表,即使用户选择的数字没有改变!

解决方案:您可以将 allPrimes 函数包装为 ** React.useMemo,** 这将防止每秒钟调用一次 allPrimes。

使用备忘录 接受两个参数:

  1. 一大块要执行的工作,封装在一个函数中
  2. 依赖项列表

在这种情况下,我们实质上是在说“重新计算素数列表 只有当 选定的编号 变化”。当组件重新渲染时 其他 原因(例如 时间 状态变量变化), 使用备忘录 忽略该函数并传递缓存的值。

这通常被称为 memoization,这就是为什么这个钩子被称为“useMemo”。

使用回调

使用回调 服务于相同的目的 使用备忘录 ,但它是专门为函数而构建的。我们直接给它一个函数,它会记住这个函数,在渲染之间线程化它。

UseMemo

我们不是返回一个数组,而是返回一个函数。然后将该函数存储在 计算 多变的。

这行得通……但有更好的方法:

useCallback

反应备忘录

或者,您可以使用 React.memo 来防止重新渲染

包装一个组件 反应备忘录 将停止在渲染树上某处触发的下游重新渲染链,除非该组件的道具已更改。

这被称为纯组件。本质上,我们告诉 React 这个组件总是会产生相同的 输出 给出相同的 输入 ,我们可以跳过没有改变的重新渲染。

这在渲染不依赖于重新渲染源(即状态、更改的数据)的重组件时很有用。

这非常重要,因为如果您在 1 个文件中有许多组件并且您只想渲染 1 个组件, React.memo 就是答案。

奖金提示

在另一个组件的渲染函数中创建组件是 反模式 那可以是 最大的性能杀手 .在每次重新渲染时,React 都会重新挂载这个组件(即销毁它并从头开始重新创建它),这将是很多的 比正常的重新渲染慢。

您可以阅读有关 React 反模式的更多信息 这里

如果你喜欢这篇文章,你可能想要 为它鼓掌 因为这对我有很大帮助。谢谢!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/20730/39370700

标签:Render,渲染,useMemo,React,备忘录,重新,组件
From: https://www.cnblogs.com/amboke/p/16663870.html

相关文章

  • react脚手架
    -react脚手架使用webpack搭建的webpack有各种loader、plugins为我们完成很多功能;比如语法检查、代码压缩、兼容性处理、图片压缩facebook已经为搭建好了react脚手架:cre......
  • 全网最简单的大文件上传与下载代码实现(React+Go)
    前言前段时间我需要实现大文件上传的需求,在网上查找了很多资料,并且也发现已经有很多优秀的博客讲了大文件上传下载这个功能。我的项目是个比较简单的项目,并没有采用特别......
  • react hook入门
    useState的使用  代码constSearch=(props:any)=>{//useState()采用一个初始state作为参数,也可以像这样使用一个空字符串。//使用state进行交互,......
  • 2022年值得推荐的五大React Native UI库
    2022年值得推荐的五大ReactNativeUI库51CTO2022-04-2411:02北京北京无忧创想信息技术有限公司关注 译者:布加迪  科技巨头之一Facebook在2015......
  • 2023年值得推荐的五大React Native UI库
    2022年值得推荐的五大ReactNativeUI库译者|布加迪科技巨头之一Facebook在2015年创建并管理ReactNative这套应用程序开发框架,以帮助开发人员构建具有原生外观感觉......
  • React Hooks { useState, useEffect }
    ReactHooks{useState,useEffect}使用状态UseState钩子是在React16.8中引入的。它允许您跟踪状态功能组件。你可能会问自己什么状态?好吧,状态通常是指组件中的动......
  • 使用 React 样式的组件设置容器样式
    使用React样式的组件设置容器样式首先,呼救声。您是否曾经尝试在两个类似的项目中使用相同的代码,并且在一个工作而一个没有工作时感到困惑?如果没有,我希望你晚上睡个好觉......
  • 你需要了解多少 Javascript 才能开始使用 React?
    你需要了解多少Javascript才能开始使用React?1.Javascript基础一个。使用var、let和const进行变量声明湾。算术、比较、逻辑运算符C。条件块和循环:if、for、f......
  • 如何将 Figma 设计转换为 React 代码:分步指南⚛️
    如何将Figma设计转换为React代码:分步指南⚛️你想加速你的React.js应用程序开发吗?正是通过自动将您的设计转换为React组件!如果是,DhiWiseWeb应用程序构建器可以......
  • React 应用程序中的简单路由
    React应用程序中的简单路由一个简单的、可扩展的路由解决方案可以满足您的应用程序的所有需求,而不会引入像React-Router这样的工具所提供的复杂性。进入:浏览器的窗......