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;

后言

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

相关推荐
hunterandroid1 天前
Service 与前台服务:让任务在后台持续运行
前端
米饭同学i1 天前
深扒 LobsterAI 官网前端动效实现方案:从交互细节到代码实践
前端
前端啊1 天前
告别 el-table 打印难题,vue3-print-el-table 来了!
前端·vue.js
JarvanMo1 天前
AI时代跨平台还有必要吗?
前端
Patrick_Wilson1 天前
幂等到底是什么?从前端视角讲透 SQL、HTTP 与 POST 接口的幂等设计
前端·后端·架构
凌览1 天前
一人公司别再上 Jenkins,真不值
前端·后端
oil欧哟1 天前
Codex 最佳实践(超级长文):先搞懂 AI,再用好 AI
前端·人工智能·后端
小小小小宇1 天前
前端渲染方式
前端
京东云开发者1 天前
全球首个!京东全栈开源JoyAI-VL-Interaction,让大模型从“一问一答”走向“边看边说”
前端
京东云开发者1 天前
正式上线!京东云AI智能渗透测试服务
前端