当前位置: 首页 > article >正文

React中通过children prop或者React.memo来优化子组件渲染【react性能优化】

文章目录

  • 前言
  • 未优化之前的代码
  • 问题
  • 解决方案一,通过children prop
  • 解决方案二,通过React.memo
  • 后言

前言

hello world欢迎来到前端的新世界


😜当前文章系列专栏:react.js
🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
💖感谢大家支持!您的观看就是作者创作的动力

未优化之前的代码

  • 这里准备了两个组件,第一个是模拟son子组件
  • 第二个是View是父组件里面渲染的组件P
  • 问题是,当我们父组件中的数据发生修改的时候,会导致重新渲染结构,但是子组件中的数据没有发生变化 也会跟着渲染,这会导致我们的性能会有点浪费
import {useState} from "react";

// 设置模拟子组件
const Son = ()=>{
    console.log("son render")
    return <div> I'm a subcomponent </div>
}


const Parent = ()=>{
    // 设置一个空的useState,类型定义为我们传输的值的类型
    const [,forceUpdate] = useState<number>()
    return (
        <>
            {/* 修改父组件的数据 */}
            <button onClick={()=>forceUpdate(Math.random())}>更新父组件</button>
            <Son></Son>
        </>
    )
}
const View:React.FC = ()=>{
    return (
        <div className="drag">
            <Parent></Parent>
        </div>
    )
}

export default View;

问题

写完了之后,我们会发现当我们修改父组件中的useState的内容的时候,子组件也会重新触发打印

在这里插入图片描述

解决方案一,通过children prop

可以把我们子组件当成标签,写到父组件中的jsx中,子组件抽象为children

import {useState} from "react";

// 设置模拟子组件
const Son = ()=>{
    console.log("son render")
    return <div> I'm a subcomponent </div>
}


const Parent = ({children}:{children:JSX.Element})=>{
    // 设置一个空的useState,类型定义为我们传输的值的类型
    const [,forceUpdate] = useState<number>()
    return (
        <>
            {/* 修改父组件的数据 */}
            <button onClick={()=>forceUpdate(Math.random())}>更新父组件</button>

            {children}
        </>
    )
}
const View:React.FC = ()=>{
    return (
        <div className="drag">
            <Parent>
                <Son></Son>
            </Parent>
        </div>
    )
}

export default View;

在这里插入图片描述

当我们点击后就可以看到,除了第一次渲染出来的,后续父组件更新后,子组件并没有发生更新

解决方案二,通过React.memo

import React, {useState} from "react";

// 设置模拟子组件
const Myson = React.memo(function Son(){
    console.log("son render")
    return <div> I'm a subcomponent </div>
})


const View:React.FC = ()=>{
    const [,forceUpdate] = useState<number>()

    return (
        <div className="drag">
            <button onClick={()=>forceUpdate(Math.random())}>更新父组件</button>
            <Myson></Myson>
        </div>
    )
}

export default View;

后言

创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力


http://www.kler.cn/a/146792.html

相关文章:

  • NavVis VLX3的精度怎么去进行验证?【上海沪敖3D】
  • 面向服务的软件工程——业务流程合规性(Business Process Compliance)(week12)
  • 用Ruby编写一个自动化测试脚本,验证网站登录功能的正确性。
  • 鸿蒙北向开发环境安装指南
  • R语言-快速对多个变量取交集
  • 剧本杀门店预约小程序,解锁沉浸式推理体验
  • scala 实现表达式解析
  • 在UE中使用C++时的Pascal命名法
  • 【服务器能干什么】二十分钟搭建一个属于自己的 RSS 服务
  • LeeCode前端算法基础100题(4)- 无重复字符的最长子串
  • 青少年CTF之PHP特性练习(1-5)
  • FlinkSql-Temporal Joins-Lookup Join
  • 基于官方YOLOv4-u5【yolov5风格实现】开发构建目标检测模型超详细实战教程【以自建缺陷检测数据集为例】
  • 力扣hot100 滑动窗口最大值 单调队列
  • C/C++ 常用加密与解密算法
  • 自己动手写编译器:golex 和 flex 比较研究 2
  • Java之面向对象《ATM自动取款机》
  • Arkts http数据请求
  • 每日一题--寻找重复数
  • opencv-python读取的图像分辨率太大不能完全显示
  • 优秀软件设计特征与原则
  • 买饮料问题
  • 【华为OD】B\C卷真题 100%通过:需要打开多少监控器 C/C++实现
  • java集合,ArrayList、LinkedList和Vector,多线程场景下如何使用 ArrayList
  • SQL Server:流程控制语言详解
  • leetcode 不同的二叉搜索树