React基础之React.memo

server/2025/3/10 17:13:51/

允许组件在props没有改变的情况下跳过渲染

React渲染的机制是:只要父组件重新渲染,子组件就会跟着重新渲染,如果子组件不需要进行重新更新,此时就会存在资源浪费

const xxx=memo(

)

import { memo, useMemo, useReducer, useState } from "react";

//使用memo进行缓存

const MemoSon=memo(

  function Son(){

    console.log('子组件要重新渲染啦');

    return <div>this is son</div>

  }

)

function reducer(state,action){

    return state+1

}

function App() {

  const [state,dispatch]=useReducer(reducer,0)

  return (

    <div className="App">

      <button onClick={()=>{dispatch()}}>{state}++</button>

     <MemoSon/>

    </div>

  );

}

export default App;

此时,点击按钮改变父组件,子组件也不会发生改变

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

比较机制

机制:使用memoe缓存组件之后,React会对每一个prop使用Object.is比较新值与老值,返回为true,就是没有发生变化

当传入的值为简单类型的时候,如果其发生变化,那么组件就会重新渲染,如果不发生变化,组件就不会重新渲染

当简单类型的值发生变化时

import { memo, useMemo, useReducer, useState } from "react";

//使用memo进行缓存

const MemoSon=memo(

  function Son({count}){

    console.log('子组件要重新渲染啦');

    return <div>this is son{count}</div>

  }

)

function App() {

  const [count,setCount]= useState(0)

  const num=100

  return (

    <div className="App">

      <button onClick={()=>{setCount(count+1)}}>count++</button>

     <MemoSon count={count}/>

    </div>

  );

}

export default App;

因此这里传入的count会发生变化,所以说子组件会重新渲染

如果我们传入的简单类型不会发生变化

import { memo, useMemo, useReducer, useState } from "react";

//使用memo进行缓存

const MemoSon=memo(

  function Son({count}){

    console.log('子组件要重新渲染啦');

    return <div>this is son{count}</div>

  }

)

function App() {

  const [count,setCount]= useState(0)

  const num=100

  return (

    <div className="App">

      <button onClick={()=>{setCount(count+1)}}>count++</button>

     <MemoSon count={num}/>

    </div>

  );

}

export default App;

组件就不会重新渲染

当传递的是一个引用类型的props,此时比较的就是新值与旧值是否相等

import { memo, useMemo, useReducer, useState } from "react";

//使用memo进行缓存

const MemoSon=memo(

  function Son({list}){

    console.log('子组件要重新渲染啦');

    return <div>this is son{list}</div>

  }

)

function App() {

  const [count,setCount]= useState(0)

  const list=[1,2,3]

  return (

    <div className="App">

      <button onClick={()=>{setCount(count+1)}}>count++</button>

     <MemoSon list={list}/>

    </div>

  );

}

export default App;

因为传入的props时引用类型,当父组件因为按钮发生变化的时候,会产生新的数组类型,所以说子组件中的props每次都会发生变化

但是如果存储引用类型不发生改变,不需要引起子组件的重新渲染的话,我们可以使用useMeno来修饰变量

import { memo, useMemo, useReducer, useState } from "react";

//使用memo进行缓存

const MemoSon=memo(

  function Son({list}){

    console.log('子组件要重新渲染啦');

    return <div>this is son{list}</div>

  }

)

function App() {

  const [count,setCount]= useState(0)

  const list=useMemo(()=>{

    return  [1,2,3]

  },[])

  return (

    <div className="App">

      <button onClick={()=>{setCount(count+1)}}>count++</button>

     <MemoSon list={list}/>

    </div>

  );

}

export default App;

此时,就算父组件发生变化,这里的数组不会发生变化,所以说不会引起子组件发生变化


http://www.ppmy.cn/server/173983.html

相关文章

PDFMathTranslate安装使用

PDF全文翻译&#xff01;&#xff01;&#xff01;&#xff01; PDFMathTranslate安装使用 它是个啥 PDFMathTranslate 可能是一个用于 PDF 文件的数学公式翻译 工具。它可能包含以下功能&#xff1a; 提取 PDF 内的数学公式 将数学公式转换成 LaTeX 代码 翻译数学公式的内…

DeepSeek-R1:引领AI领域革新,MLA技术助力模型迁移

摘要 DeepSeek的MLA技术实现了大型机器学习模型的轻松迁移&#xff0c;其突破性产品DeepSeek-R1凭借显著降低的训练和推理成本&#xff0c;吸引了业界广泛关注。MLA技术的核心在于创新性的低秩压缩键值缓存架构&#xff0c;使得推理成本大幅减少&#xff0c;仅为同等性能大型模…

vue2 插值语法中使用可选链运算符(.?)compile异常排查思路

[TOC](vue2 插值语法中使用可选链运算符(.?)compile异常排查思路) 前言 最近接到组内前端求助&#xff0c;在使用v-for进行动态渲染的时候项目突然不能正常编译了&#xff0c;报错提示SyntaxError: Unexpected token ...十分奇怪 代码可参考如下&#xff1a; <h3>动态…

LDR6500 PD 协议芯片的运用场景

LDR6500 是一款由 乐得瑞科技&#xff08;Leadrive Technology&#xff09; 开发的 USB PD&#xff08;Power Delivery&#xff09;协议芯片&#xff0c;专为支持 USB Type-C 接口的电源管理和快充场景设计。其高集成度、多协议兼容性和安全保护功能使其在多个领域有广泛的应用…

基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例

基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例 一、引言&#xff1a;智能化时代的提示工程工具 在人工智能技术广泛应用的时代背景下&#xff0c;如何与AI模型进行有效交互已成为关键技能。本文介绍的"AI任务需求与提示语策略生成器"正是基于…

VSCode 配置优化指南:打造极致高效的前端开发环境

VSCode 配置优化指南&#xff1a;打造极致高效的前端开发环境 一、基础环境配置&#xff1a;让开发更流畅 1. 性能优化设置 // settings.json {"files.autoSave": "afterDelay", // 自动保存&#xff08;延迟1秒&#xff09;"files.exclud…

视频录像机视频通道是指什么

视频录像机的视频通道是指摄像机在监控矩阵或硬盘录像机设备上的视频输入的物理位置。 与摄像头数量关系&#xff1a;在视频监控系统中&#xff0c;有多少个摄像头就需要多少路视频通道&#xff0c;通道数量决定了视频录像机可接入摄像头的数量&#xff0c;一般硬盘录像机有4路…

可重构智能表面(RIS)的全面介绍

引言 可重构智能表面(Reconfigurable Intelligent Surface, RIS)是无线通信领域的一种革命性技术,旨在通过主动操控无线电波的传播环境来优化通信性能。与传统的无线通信环境不同,RIS使传播路径从被动变为可控,从而改善信号覆盖、增强频谱效率并降低能耗。在未来无线网络…