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

这篇具有很好参考价值的文章主要介绍了React三种通过属性传递组件本身的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

直接传递 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 (
    <img
      className="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 来优化子组件的渲染性能。文章来源地址https://www.toymoban.com/news/detail-525224.html

使用 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>
  );
});

到了这里,关于React三种通过属性传递组件本身的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • react通过ref获取函数子组件实例方法

    在react16之后带来了hooks之后,确实方便了很多组件开发,也加快了函数式编程的速度,但是当你通过useRef获取子组件的时候,又恰好子组件是一个函数组件,那么将会报一个错误:报这个错误的主要原因是函数组件没有实例对象,所以你没办法通过ref获取子组件实例  Warnin

    2024年02月11日
    浏览(28)
  • Vue3前端开发,如何获取组件内dom对象以及子组件的属性和方法

    Vue3前端开发,借助Ref来获取组件内dom对象,借助defineExpose编译宏可以获取到子组件的属性和方法。 app入口文件,我们作为父组件,在里面调用了自定义组件TestCom.vue。 先做了一个测试,借助于ref来访问自身的dom对象。如图所示是可以拿到的。 ref又称谓钩子函数,在vue2版本中

    2024年01月22日
    浏览(47)
  • vue3中父组件与组件之间参数传递,使用(defineProps/defineEmits),涉及属性传递,对象传递,数组传递,以及事件传递

    传递属性 父组件: 子组件: 传递对象或者数组 父组件: 子组件: 父组件: 子组件:

    2024年02月13日
    浏览(33)
  • React中父子组件参数传递讲解

    结合案例:github搜索案例 案例结果展示如下图 1.父容器代码 说明:父容器中包含了两个组件模块,分别是Search和List,用来搜索和显示 2.搜索Search子模块代码 3.展示Lisi子模块代码 父子参数传递分析 1.子(Search)传父(App) 首先在父容器APP的state中创建状态属性,再传给子模块Sea

    2024年02月09日
    浏览(27)
  • 【react】记录一次react组件props依赖异步数据(setFieldsValue)后传递form给子组件,再逐层传递给孙子组件引起的未渲染异常

    背景 react祖父组件设置异步数据(setFieldsValue)后传递form给子组件,再逐层传递给孙子组件引起的未渲染异常,孙子组件如果不设置useEffect和useState去监听value的值进行重渲染,会出现获取得到value最新值,但是不进行渲染的异常 解决前后的代码对比 完整代码(异常): 完整

    2024年01月17日
    浏览(35)
  • VUE,子组件给父组件传递参数,props 自定义属性,ref

    AA组件 BB CC

    2024年02月14日
    浏览(29)
  • React组件间数据传递(弹框和高阶组件(HOC)特性实现)

    在现代前端开发中,React 已经成为了最受欢迎的 JavaScript 库之一。而在复杂的应用中,不同组件之间的数据传递问题显得尤为关键。在本文中,我们将探讨一种高效的方法,即如何利用弹框和高阶组件特性来实现 React 组件间的数据传递。我们将通过一个具体的业务场景来深入

    2024年02月11日
    浏览(31)
  • 【react】使用context进行跨级组件数据传递

    官方文档:使用 Context 深层传递参数、useContext 应用:无需为每层组件手动添加 props,能狗在组件树间进行数据传递的方法。 1、创建context ContextProvider.tsx: 要更新 context,请将其与 state 结合。在父组件中声明一个状态变量,并将当前状态作为 context value 传递给 provider。 上述写

    2024年01月25日
    浏览(31)
  • Java后端和前端传递的请求参数的三种类型

    在 HTTP 请求中,常见的请求参数类型有三种:`application/x-www-form-urlencoded`、`multipart/form-data` 和 `application/json`(通常用于 `raw` 类型)。这三种类型主要指的是请求体中的数据格式,其中包括参数的传递方式和编码。 1. **`application/x-www-form-urlencoded`:**    - 这是默认的编码类型

    2024年02月02日
    浏览(35)
  • React 组件之属性

    如果你想要实现自己的梦想,就必须先拥有勇气去追求它。 属性 props 主要解决两个问题: 复用性问题以及可以让组件之间通信。 属性 props 正常是外部传入的,组件内部也可以通过一些方式来初始化的设置,属性不能被组件自己更改(属性是描述性质、特点的,组件自己不

    2024年02月05日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包