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;

后言

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

相关推荐
Chen不旧2 分钟前
关于用户权限的设计,前端和后端都需要考虑
前端·权限
DsirNg3 分钟前
前端和运维的哪些爱
前端
7***31883 分钟前
Go-Gin Web 框架完整教程
前端·golang·gin
FinClip5 分钟前
FinClip助力银行整合多个App,打造一站式超级应用
前端
火柴就是我9 分钟前
从头写一个自己的app
android·前端·flutter
FinClip10 分钟前
小程序如何一键生成鸿蒙APP?FinClip助力企业快速布局Harmony OS生态
前端
月下点灯25 分钟前
🔄记住这张图,脑子跟着浏览器的事件循环(Event Loop)转起来了
前端·javascript·浏览器
邹小邹-AI29 分钟前
Rust + 前端:下一个十年的“王炸组合”
开发语言·前端·rust
行走在顶尖31 分钟前
vue3+ant-design-vue
前端
华仔啊1 小时前
图片标签用 img 还是 picture?很多人彻底弄混了!
前端·html