第26节——React.memo+ React.PureComponent

news/2024/7/15 19:06:49 标签: react.js, javascript, 前端

一、React.memo的概念

**React.memo 为高阶组件。**如果你的组件在相同 props 的情况下渲染相同的结果,那么你可以通过将其包装在 React.memo 中调用,以此通过记忆组件渲染结果的方式来提高组件的性能表现。这意味着在这种情况下,React 将跳过渲染组件的操作并直接复用最近一次渲染的结果。

import React, { useState, useEffect, useContext } from 'react';

// 如果num不改变当前组件不会重新渲染
const MyComponent =  React.memo((props) => {
  /* 使用 props 渲染 */
  return (
    <div>{props.num}</div>
  )
})
export default function hook() {

  const [num, setNum] = useState(1)

  return (
    <div>
      <button onClick={() => setNum(num + 1)}>+1</button>
      <MyComponent num={num}></MyComponent>
    </div>
  )
}

二、React.memo的特点

React.memo 仅检查 props 变更。如果函数组件被 React.memo 包裹,且其实现中拥有 useState,useReducer 或 useContext 的 Hook,当 state 或 context 发生变化时,它仍会重新渲染。

三、React.memo可接受第二个参数

默认情况下其只会对复杂对象做浅层对比,如果你想要控制对比过程,那么请将自定义的比较函数通过第二个参数传入来实现,第二个参数是一个函数,返回true不渲染,false渲染

import React, { useState, useEffect, useContext } from 'react';


const MyComponent =  React.memo((props) => {
  /* 使用 props 渲染 */
  return (
    <div>{props.num}</div>
  )
  /**
   * prevProps 上次的值
   * nextProps 最新的值
   * 
   * 如果传来的值是偶数的话则不更新组件
   */
}, (prevProps, nextProps) => {
  console.log(nextProps, nextProps.num % 2)
  return nextProps.num % 2 === 0
})

export default function hook() {

  const [num, setNum] = useState(1)

  useEffect(() => {
    /**
     * 当它是一个空数组时,回调只会被触发一次,类似于 componentDidMount
     */
    console.log("componentDidmount")
  }, [])

  return (
    <div>
      <button onClick={() => setNum(num + 1)}>+1</button>
      <MyComponent num={num}></MyComponent>
    </div>
  )
}

四、React.memo的使用场景

1、展示型组件

如果你有一个仅仅用于展示数据的组件,且数据不需要频繁更新,那么可以使用 React.memo 避免不必要的重新渲染。

2、性能瓶颈

如果某个组件是你应用中性能瓶颈的主要原因,那么可以使用 React.memo 优化它的性能。

3、模拟 PureComponent

如果你想在函数组件中模拟类组件的 PureComponent 行为,那么可以使用 React.memo

五、React.PureComponent的概念

React.PureComponent 是一个特殊的 React 组件类,它可以自动实现浅层比较(shallow comparison),决定是否需要重新渲染组件。

与普通的 React 组件类不同,React.PureComponent 可以避免不必要的渲染,提高组件的性能。

如果你的组件是一个展示型组件,且不需要经常更新,那么你可以使用 React.PureComponent 代替普通的 React 组件类。

六、例子

使用方法非常简单,只需要在组件类上继承 React.PureComponent 即可

class MyComponent extends React.PureComponent {
  render() {
    /* ... */
  }
}

六、总结

因为 React.PureComponent 实现了浅层比较,所以可以避免不必要的渲染。如果你的组件需要进行深层比较,那么你需要手动实现 shouldComponentUpdate 方法。

因此,如果你的组件是一个展示型组件,且不需要经常更新,那么可以考虑使用 React.PureComponent 来优化组件的性能

七、React.PureComponent 和 React.memo的区别

1、继承关系

React.PureComponent 是一个 React 组件类,可以被继承;而 React.memo 是一个高阶组件,不能被继承。

2、比较方式

React.PureComponent 使用的是浅层比较(shallow comparison)来决定是否需要重新渲染组件;而 React.memo 是通过比较组件的 props 来决定是否需要重新渲染的。如果需要进行深层比较,则需要使用自定义的比较函数(comparison function)。

3、使用场景

React.PureComponent 适用于状态不多、不需要处理复杂逻辑的组件;而 React.memo 则适用于任何情况下,甚至可以代替 React.PureComponent

4、总结

因此,当你需要优化 React 组件的性能时,应该根据具体情况来决定使用 React.PureComponent 还是 React.memo。通常来说,React.memo 更加灵活和通用,因此更加推荐使用


http://www.niftyadmin.cn/n/5028353.html

相关文章

1、MongoDb综述

1. MongoDb综述 1.1. 什么是Nosql NoSQL&#xff1a;Not Only SQL ,本质也是一种数据库的技术&#xff0c;相对于传统数据库技术&#xff0c;它不会遵循一些约束&#xff0c;比如&#xff1a;sql标准、ACID属性&#xff0c;表结构等。 Nosql优点 l 满足对数据库的高并发读写…

70.C++虚析构函数

今天进行了新的学习。 目录 1.什么是虚析构函数 2.为什么需要虚析构函数 3.虚析构函数的声明 4.派生类中的析构函数 5.使用虚析构函数 1.什么是虚析构函数 虚析构函数是在C中用于处理继承层次结构中的资源释放的一种技术。它在析构函数前加上 virtual 关键字&#xff0c;…

《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组矩阵

《数据结构、算法与应用C语言描述》使用C语言实现二维数组矩阵 行主映射与列主映射 如图7-2所示。 行主映射&#xff1a;从第一行开始&#xff0c;依次对每一行的索引从左至右连续编号。 列主映射&#xff1a;对索引的编号从最左列开始&#xff0c;依次对每一列的索引从上到…

gin框架再探

Gin框架介绍及使用 | 李文周的博客 (liwenzhou.com) lesson03_gin框架初识_哔哩哔哩_bilibili 1.路由引擎 //路由引擎 rgin.Default() 2.一些http请求方法 get post put delete等等 遇到什么路径&#xff0c;执行什么函数 r.GET("/hello",func{做你想做的事返回…

idea项目配置三大步

场景&#xff1a; 使用 idea 打开一个新项目的时候&#xff0c;想让项目迅速跑起来&#xff0c; 其实只需要下面简单三步&#xff1a; 1. 首先&#xff0c;配maven 2. 其次&#xff0c;配置 jdk 这里配置 project 就行了&#xff0c;不用管Modules中的配置。 3. 最后&#…

90. 子集 II

给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,2] 输出…

基于matlab实现的弹簧振动系统模型程序(动态模型)

完整代码&#xff1a; clear all; %System data m1.0; zeta0.01; omega01.0; Dt1.0; f01.0; x00.0; dotx00.0; xmaxsqrt(x0^2(dotx0/omega0)^2)min([0.5*abs(f0)*Dt/(m*omega0) f0/omega0^2]); omegadomega0*sqrt(1-zeta^2); dt00.1*pi/omega0; nstep500; a0.70; b0.…

C++复习笔记--C++常用注释规范

目录 1--常用注释规范 2--代码实例 1--常用注释规范 ① brief 表示简介&#xff0c;用于简单介绍函数或类的作用和功能&#xff1b; ② param 表示参数&#xff0c;用于介绍和说明函数或类的参数&#xff1b; ③ return 表示返回类型&#xff0c;用于说明函数的返回类型&…