react组件渲染性能优化之函数组件-memo使用

ops/2024/10/23 18:27:17/
函数组件赋值相同的值视图不会渲染,类组件会,因为函数组件默认就阻止了
javascript">import {useState} from 'react'
export default function App() {const [counter, setCounter] = useState(1)console.log('App组件渲染了');return(<div><h1>{counter}</h1><button onClick={() => setCounter(1)}>+1</button></div>)
}
使用memo:memo避免父组件更新时,子组件跟着更新

示例:在 App 组件内部修改 counter,然后 counter2 作为 porps 传递给子组件,此时我们修改 counter 的状态时,子组件也会跟着更新,原因很简单,因为父组件更新了,那你子组件当然要重新更新。

App.jsx

javascript">import ChildCom from './components/ChildCom'
import {uesState} from 'react'
export default function App() {const [counter, setCounter] = useState(1)const [counter2, setCounter2] = useState(1)console.log("App 渲染了")return (<div><div>{counter}</div><button onClick={() => setCounter1(counter + 1)}>+1</button><ChildCom1 counter={counter2} setCounter={setCounter2} /></div>);
}

ChildCom.jsx

javascript">import React from "react"
function ChildCom(props) {console.log("ChildCom渲染了")return (<div><div>ChildCom1</div><div>{props.counter}</div></div>);
}export default ChildCom;

子组件的更新是没有必要的,因为传递给子组件的 props 并没有发生变化,我们就可以使用 React.memo,之后我们再更新 counter 时,由于传递给子组件的 counter2 这个 props 属性并没有变化,因此子组件不会更新。

javascript">import React from "react"
function ChildCom(props) {console.log("ChildCom渲染了")return (<div><div>ChildCom</div><div>{props.counter}</div></div>);
}export default React.memo(ChildCom);

React.memo只做浅比较,比如修改数组的话,子组件不会更新

javascript">import React, { useState } from 'react';
import ChildCom1 from "./components/ChildCom1"function App() {const [counter1, setCounter1] = useState(2);const [stu, setStu] = useState(["张三","李四"]);console.log("App 渲染了");function clickHandle(){setCounter1(counter1 + 1);stu.push("王武");setStu(stu)}return (<div><div>{counter1}</div><button onClick={clickHandle}>+1</button><ChildCom1 stu={stu} setStu={setStu} /></div>);
}export default App;
javascript">import React, {memo} from "react"
function ChildCom1(props) {console.log("ChildCom1 渲染了")const lis = props.stu.map((it,index)=>(<li key={index}>{it}</li>))return (<div><div>ChildCom1</div><ul>{lis}</ul></div>);
}export default memo(ChildCom1);

你需要对原数组进行深拷贝,然后再赋值给原数组

javascript">function clickHandle(){setCounter1(counter1 + 1);const arr = [...stu];arr.push("王五");setStu(arr)
}

默认情况下React.memo只会对对象做浅比较,如果你想要控制这个过程,请在第二个参数里面写上你自己的控制流程

javascript">function MyComponent(props) {/* 使用 props 渲染 */
}
function areEqual(prevProps, nextProps) {/*如果把 nextProps 传入 render 方法的返回结果与将 prevProps 传入 render 方法的返回结果一致则返回 true,否则返回 false*/
}
export default React.memo(MyComponent, areEqual);


http://www.ppmy.cn/ops/41664.html

相关文章

设计模式--适配器模式

引言 在软件开发中&#xff0c;适配器模式(Adapter Pattern) 是一种结构型设计模式&#xff0c;其核心思想在于将一个接口转换为客户期望的另一个接口&#xff0c;使得原本由于接口不兼容而无法协同工作的类能够一起工作。适配器模式主要用于解决两个类之间的接口不匹配问题&a…

数据结构——二叉树知识点详解!

引言&#xff1a;本篇博客将详细介绍到数据结构中的又一位大将——二叉树。它也是我们目前学到的第一个非线性的数据结构。并且本章将学到的概念居多&#xff0c;希望大家可以理解并牢记。 更多有关C语言和数据结构知识详解可前往个人主页&#xff1a;计信猫 目录 一&#xff0…

实现腾讯地图的接口调用以及微信小程序的地图标注

目录 微信小程序端1. 引入腾讯地图SDK2. 使用地图组件3. 地图页面编写4. 地图标注 Java后端业务逻辑1. 引入腾讯地图Java SDK2. 配置API密钥3. 调用腾讯地图API4. 提供小程序调用的接口 总结 要实现腾讯地图的接口调用以及微信小程序的地图标注&#xff0c;需要分为两个部分&am…

# 从浅入深 学习 SpringCloud 微服务架构(十六)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十六&#xff09; 一、SpringCloudStream&#xff1a;自定义消息通道 1、在子工程 stream_product &#xff08;子模块&#xff09;中,创建 自定义的消息通道类 MyProcessor.java /*** spring_cloud_demo\stream_product…

大学生须知~~毕业季行李轻松寄,怎么邮寄行李省钱!

毕业季即将到来&#xff0c;告别母校告别这座城市&#xff0c;肯定恋恋不舍&#xff0c;这几年的学生生涯也留下了不少行李。怎么邮寄才便宜呢&#xff1f;&#xff1f; 记得找惠发快递呀&#xff01;因为我们平台是跟快递总部合作的&#xff0c;不管你寄大件还是快递都很便宜…

王道c语言-文件操作

fopen fgetc fputc fwrite fread fgets fputs //main.c #include <stdio.h> #include <string.h>int main() {FILE *fp;int ret;//打开/创建文件fp fopen("test.txt", "wb");if (NULL fp) {perror("fopen fail");//perror aim to…

google test 使用指南

目录 测试项目 calculator.h calculator.cpp test01.cpp 创建新项目 选择Google Test 选择要测试的项目 pch.cpp 加入依赖 设为启动项目 ​编辑 运行 ​编辑 关键点 测试项目 calculator.h #ifndef __CALCULATOR_H__ #define __CALCULATOR_H__#include <i…

深化产教融合,泰迪智能科技助力西南林业大学提质培优

2024年5月7日&#xff0c;泰迪智能科技昆明分公司院校部总监查良红和数据部负责人余雄亮赴西南林业大学理学院就工作室共建事宜进行交流会谈。西南林业大学理学院院长张雁、党委副书记魏轶、副院长谢爽、就业负责人罗丽及学生代表参与本次交流会。 会议伊始&#xff0c;谢副院长…