详解使用React.memo()来优化函数组件的性能

下面是详解使用React.memo()优化函数组件性能的攻略。

React.memo()是什么

React.memo()是一种HOC(High Order Component,高阶组件),用于优化函数组件性能。类似于PureComponentReact.memo()可以通过浅层对比(props的浅层对比)来避免因为相同props重新渲染函数组件导致的性能问题。
在函数组件中,如果组件渲染的代价比较昂贵,那么可以使用 React.memo()来避免不必要的渲染。

const MyComponent = React.memo(props => {
  /* 组件的具体代码 */
})

如何使用

使用 React.memo() 来包装一个函数组件,并返回一个优化后的函数组件。

const MyComponent = React.memo(props => {
  /* 组件的具体代码 */
})

为什么使用

  1. 提高系统性能
  2. 减少不必要的渲染

使用示例1

import React, { useState } from 'react';
import ReactDOM from 'react-dom';

const Button = React.memo(({ onClick, children }) => {
  console.log(`Button - ${children}渲染了!`)
  return <button onClick={onClick}>{children}</button>
})

const App = () => {
  const [count, setCount] = useState(0)

  const handleClick = () => {
    setCount(count + 1)
  }

  console.log('App渲染了!')
  return (
    <div>
      <p>点击了{count}次</p>
      <Button onClick={handleClick}>+1</Button>
    </div>
  )
}

const container = document.getElementById('root')
ReactDOM.render(<App />, container)

在控制台看到的日志输出如下:

App渲染了!
Button - +1渲染了!

初始化render了一次,在点击+1按钮后,因为App的state更新了,App就被重新render了。在App的render中,Button的props没有更新,所以只有第一次渲染才会输出Button的“渲染了”日志。这是因为Button函数组件使用了React.memo(),导致如果props没有更新,则Button组件不会被重新渲染。

使用示例2

import React, { useState } from 'react';
import ReactDOM from 'react-dom';

const Count = ({ value }) => {
  console.log(`Count - ${value}渲染了!`)
  return <h3>{value}</h3>
}

const App = () => {
  const [count1, setCount1] = useState(0)
  const [count2, setCount2] = useState(0)

  const handleClick1 = () => {
    setCount1(count1 + 1)
  }

  const handleClick2 = () => {
    setCount2(count2 + 1)
  }

  console.log('App渲染了!')
  return (
    <div>
      <button onClick={handleClick1}>count1 + 1</button>
      <button onClick={handleClick2}>count2 + 1</button>
      <Count value={count1} />
      <Count value={count2} />
    </div>
  )
}

const container = document.getElementById('root')
ReactDOM.render(<App />, container)

在控制台看到的日志输出如下:

App渲染了!
Count - 0渲染了!
Count - 0渲染了!

和示例1不同,现在有两个Count组件在渲染了。

在点击Count1加一按钮后,只有Count1会因为props变化而重新渲染,而没有因为Count2改变而重新渲染。
这是因为Count组件没有使用React.memo(),所以在App的render中,Count组件每次都会重新渲染。

如果我们对Count组件使用React.memo()在进行优化:

const Count = React.memo(({ value }) => {
  console.log(`Count - ${value}渲染了!`)
  return <h3>{value}</h3>
})

则在App的render中,只有当Count组件的props变化时才会重新渲染。在此示例中,由于每一个Count的props变化,所以每一个Count都会重新渲染。

这就是使用React.memo()来优化函数组件的性能的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解使用React.memo()来优化函数组件的性能 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 深度分析正则(pcre)最大回溯/递归限制

    深度分析正则(pcre)最大回溯/递归限制 正则表达式是一种描述字符模式的工具,由于其强大的表达能力和广泛的应用场景,成为了数据分析、文本挖掘等领域的重要工具。正则表达式引擎可以进行的匹配步骤是有限的,当模式中包含递归或回溯时,引擎可能会一直重复步骤,导致匹配效率降低,甚至出现崩溃等问题。 为了避免这种状况,正则表达式引擎实现了最大回溯/递归限制,即“PCR…

    other 2023年6月27日
    00
  • Vue3嵌套路由中使用keep-alive缓存多层的实现

    Vue3嵌套路由中使用keep-alive缓存多层的实现攻略 在Vue3中,我们可以使用keep-alive组件来缓存组件的状态,以提高应用的性能。当在嵌套路由中使用keep-alive时,我们需要一些额外的配置来确保多层嵌套的组件能够正确地被缓存。 下面是一个完整的攻略,包含了两个示例说明。 步骤1:安装Vue Router和Vue3 首先,确保你已经安装…

    other 2023年7月28日
    00
  • Python即时网络爬虫项目: 内容提取器的定义

    Python即时网络爬虫项目:内容提取器的定义 在Python网络爬虫项目中,内容提取器是一个重要的组件,用于从HTML页面中提取所需的内容。内容提取器可以根据指定的规则,从HTML页面中提取出需要的数据,并将其保存到指定的数据结构中。在本文中,我们将详细介绍内容提取器的定义和使用方法,并提供两个示例说明。 内容提取器的定义 内容提取器是一个用于从HTML页…

    other 2023年5月5日
    00
  • Android自定义ViewGroup实现选择面板

    下面是详细讲解 “Android自定义ViewGroup实现选择面板” 的完整攻略。 1. 前言 在日常的 App 开发中,我们经常会对页面进行布局的调整,比如添加选择面板。而这时,我们往往无法使用 Android 原生提供的布局组件来实现,因为我们需要的是一个自定义的布局组件,来实现我们自己的需求。 因此,通过本文,你将能够学习到如何自定义一个针对特定功能…

    other 2023年6月25日
    00
  • redis设置永不过期

    Redis设置永不过期 Redis是一种常见的内存数据库,它支持键值存储、持久化、发布订阅等多种功能。在Redis中,数据的存储会有一个过期时间,一旦过期就会被删除。但是,在某些场景中,我们需要将某些数据设置为永不过期,让它们一直留在Redis中,这时我们可以采取以下方法实现。 方法一:设置过期时间为极大值 Redis中可以使用EXPIRE命令设置键的过期时…

    其他 2023年3月28日
    00
  • Java结合百度云存储BCS代码分享

    下面我将详细讲解Java结合百度云存储BCS的完整攻略,包含以下几个步骤: 注册百度云账号 要使用百度云存储BCS,首先要注册百度云账号。如果您已经有账号,可以直接进入控制台,新建应用并开启BCS服务。 新建Bucket 在控制台的BCS管理页面中,新建一个Bucket。Bucket相当于一个存储空间,可以用来存放文件。 获取Access Key和Secre…

    other 2023年6月26日
    00
  • 前端图片懒加载的原理与3种实现方式举例

    前端图片懒加载的原理与3种实现方式举例 前端图片懒加载原理 前端图片懒加载,顾名思义,就是在页面渲染时,不加载显示在当前视线范围之外的图片,只有当用户滚动页面至该图片可见位置时,才开始加载显示该图片。 这种技术的核心原理就是“赖加载”。通常情况下,页面中的图片是通过img标签将其src属性指向具体的url来加载显示的。而前端图片懒加载,通过修改img标签的s…

    other 2023年6月25日
    00
  • 获取根目录的URL例如http://localhost:51898

    获取根目录的URL可以通过以下两种方式实现: 使用ASP.NET Core中的IHttpContextAccessor 在ASP.NET Core应用中,我们可以通过在Startup.Configure方法中注入IHttpContextAccessor服务,然后调用HttpContext.Request获取当前请求的信息。通过Request对象可以获取到当前…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部