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

文章目录

前言

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


😜当前文章系列专栏:react.js

🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹

💖感谢大家支持!您的观看就是作者创作的动力

未优化之前的代码

  • 这里准备了两个组件,第一个是模拟son子组件
  • 第二个是View是父组件里面渲染的组件P
  • 问题是,当我们父组件中的数据发生修改的时候,会导致重新渲染结构,但是子组件中的数据没有发生变化 也会跟着渲染,这会导致我们的性能会有点浪费
javascript 复制代码
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

javascript 复制代码
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

javascript 复制代码
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;

后言

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

相关推荐
一 乐10 分钟前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
C_心欲无痕36 分钟前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
清沫40 分钟前
Claude Skills:Agent 能力扩展的新范式
前端·ai编程
yinuo1 小时前
前端跨页面通信终极指南:方案拆解、对比分析
前端
yinuo2 小时前
前端跨页面通讯终极指南⑨:IndexedDB 用法全解析
前端
xkxnq2 小时前
第二阶段:Vue 组件化开发(第 16天)
前端·javascript·vue.js
烛阴2 小时前
拒绝配置地狱!5 分钟搭建 Three.js + Parcel 完美开发环境
前端·webgl·three.js
xkxnq3 小时前
第一阶段:Vue 基础入门(第 15天)
前端·javascript·vue.js
anyup4 小时前
2026第一站:分享我在高德大赛现场学到的技术、产品与心得
前端·架构·harmonyos
BBBBBAAAAAi4 小时前
Claude Code安装记录
开发语言·前端·javascript