React三种通过属性传递组件本身的方法

news/2024/12/29 16:49:04/

直接传递 JSX 创建好的元素

把要传递的组件作为 JSX 元素写在属性值里,然后在接收的组件里用 {this.props.xxx} 来渲染。这种方法的优点是直观和灵活,缺点是可能造成不必要的重复渲染。

// 父组件
function Profile() {return (<div><Avatar size={100} person={{ name: 'Katsuko Saruhashi', imageId: 'YfeOqp2' }} /><Avatar size={80} person={{ name: 'Aklilu Lemma', imageId: 'OKS67lh' }} /><Avatar size={50} person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }} /></div>);
}// 子组件
function Avatar({ person, size }) {return (<imgclassName="avatar"src={getImageUrl(person)}alt={person.name}width={size}height={size}/>);
}

直接传递 JSX 创建好的元素的方法会造成不必要的渲染,是因为每次父组件重新渲染时,都会创建一个新的 JSX 元素,即使它的内容没有变化。这样会导致 React 认为子组件的属性发生了变化,从而触发子组件的重新渲染。
在上述代码中,每次 Profile 重新渲染时,都会创建一个新的 JSX 元素,每次 person 属性变化时,都会重新渲染 Avatar。

传递组件本身

把要传递的组件作为一个变量或常量,然后把它赋值给属性。这种方法的优点是可以避免重复渲染,缺点是需要额外定义一个变量或常量。

// 父组件
import { DownloadOutlined } from '@ant-design/icons';function Profile() {return (<div><Button icon={<DownloadOutlined />} /></div>);
}// 子组件
function Button({ icon }) {return (<button className="button">{icon}</button>);
}

传递返回 JSX 创建好的元素的函数

把要传递的组件封装成一个函数,然后把函数赋值给属性。

// 父组件
function Profile() {return (<div><Button renderIcon={() => <DownloadOutlined />} /></div>);
}// 子组件
function Button({ renderIcon }) {return (<button className="button">{renderIcon()}</button>);
}

这种方法的优点是可以实现动态渲染和传递参数,缺点是可能造成性能损失。是因为每次父组件重新渲染时,都会调用一次函数,即使函数的返回值没有变化。这样会导致 React 认为子组件的属性发生了变化,从而触发子组件的重新渲染。
在上述代码中,每次 Profile 重新渲染时,都会调用一次 renderIcon 函数;每次 renderIcon 属性变化时,都会重新渲染 Button。
为了避免这种情况,可以使用 useCallback 钩子来缓存函数的引用。或者使用 React.memo 来优化子组件的渲染性能。

使用 useCallback 钩子来缓存函数的引用
// 父组件
import React, { useCallback } from 'react';function Profile() {// \uD83D\uDC47️ 使用 useCallback 钩子来缓存函数的引用,避免每次重新渲染时都创建一个新的函数const renderIcon = useCallback(() => <DownloadOutlined />, []);return (<div><Button renderIcon={renderIcon} /></div>);
}// 子组件
function Button({ renderIcon }) {return (<button className="button">{renderIcon()}</button>);
}
使用 React.memo 来优化子组件的渲染性能
// 父组件
function Profile() {return (<div><Button renderIcon={() => <DownloadOutlined />} /></div>);
}// 子组件
// \uD83D\uDC47️ 使用 React.memo 来包裹子组件,避免属性相同的情况下重新渲染
const Button = React.memo(function Button({ renderIcon }) {return (<button className="button">{renderIcon()}</button>);
});

http://www.ppmy.cn/news/719067.html

相关文章

吃鸡专用计算机,如何给雷神五代新911耀武九代i7游戏本电脑重新安装吃鸡win10专用系统...

近期有小伙伴问小编如何给雷神五代新911耀武九代i7游戏本电脑重新安装吃鸡win10专用系统,雷神五代新911耀武九代i7游戏本电脑,是目前非常火爆的游戏本之一,而吃鸡游戏也是非常热门的游戏之一,可有些用户不喜欢预装的Win10家庭版系统,为了解决兼容吃鸡游戏的问题,小编给大…

怎么批量禁用公司u盘功能

在某些情况下&#xff0c;禁用U盘的功能可能是必要的。无论是出于安全考虑&#xff0c;还是为了限制员工在工作时间内使用个人设备&#xff0c;禁用U盘可以帮助管理和控制数据的流动。本文将介绍一些禁用U盘的方法&#xff08;其中方法三可以公司局域网内部一键禁止U盘的使用&a…

javaagent实战(使用javassist)

文章目录 前言代码实战1.创建maven工程、并添加相关依赖2.编码拦截代码3. 打包4. 使用前言 javaagent介绍:javaagent是依赖java底层提供的一个叫instrument的JVMTI Agent。简单来说,javaagent是一个JVM的“插件”。 在java运行命令中 javaagent是一个参数,用来指定agent。 启…

HTML设置字体颜色

<font color"blue"></font>

win10默认系统字体更改

以管理员身份运行命令提示符regedit&#xff0c;打开注册表&#xff0c;定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Fonts 找到对自己要改为的满意的字体右键——修改——复制数值数据 在找到Microsoft YaHei & Microsoft YaHei UI (TrueTyp…

字体图标改颜色

直接用color属性就可以改了,我在项目里面也用到很多字体图标 直接修改颜色 .mui-icon-gear-filled:before { content: \e532; color: #045380; } .mui-icon-extra-order:before { content: "\e113"; color: #5A8C19; } .mui-icon-extra-university:befor…

html怎么设置字体颜色

html怎么设置字体颜色 HTML中设置字体颜色有很多方式&#xff1a; 方式一&#xff1a;HTML命令方式 <font color"red">这里是红色</font> &#xff08;代表将“这里是红色”这些文字设置为红色&#xff09; 方式二&#xff1a;内联CSS样式 <div …

win10修改系统默认字体

今日打开主机&#xff0c;发现windows10 的字体莫名其妙被改了 新字体是真的丑 大家可以看一下 ​ 真的丑。。。。 步入正题 打开注册表 进入 HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\Fonts下 找到 Microsoft YaHei & Microsoft YaH…