HOW - React 组件中传递一个组件属性如何定义

embedded/2024/12/25 9:09:55/

在 React 中,如果你希望通过属性传递一个组件,通常有以下几种常见情况及对应的类型定义方法。


1. 传递一个 React 组件类型

如果你希望传递的是一个组件(例如 MyComponent 或类似的组件),可以用 React.ComponentType 定义类型。

interface Props {Component: React.ComponentType<any>; // 接受任何组件
}const Wrapper: React.FC<Props> = ({ Component }) => {return (<div><Component /></div>);
};// 用法
const MyComponent = () => <div>Hello</div>;<Wrapper Component={MyComponent} />;
类型解释
  • React.ComponentType<any>: 表示一个可以渲染的 React 组件,可能是函数组件或类组件。
  • 如果你知道具体的组件需要的 props 类型,可以替换 any 为具体的 props 类型。

2. 传递一个 React 节点或组件实例

如果允许传递组件实例(例如 <MyComponent />)或普通的 React 节点,类型是 React.ReactNode

interface Props {children: React.ReactNode; // React 节点或组件实例
}const Wrapper: React.FC<Props> = ({ children }) => {return <div>{children}</div>;
};// 用法
<Wrapper><div>Hello</div><MyComponent />
</Wrapper>;
类型解释
  • React.ReactNode 表示任何可以被渲染的内容,包括:
    • JSX 元素
    • 字符串、数字、布尔值、nullundefined
    • 数组
    • React.Fragment

3. 传递一个渲染函数

如果你希望传递的是一个渲染函数(可以接收参数并返回一个组件),可以用 (props: Props) => JSX.Element 定义类型。

interface Props {render: (data: string) => JSX.Element;
}const Wrapper: React.FC<Props> = ({ render }) => {const data = "Hello, world!";return <div>{render(data)}</div>;
};// 用法
<Wrapper render={(data) => <div>{data}</div>} />;
类型解释
  • (data: string) => JSX.Element 是一个函数类型,接受 data 参数并返回 JSX。

4. 动态组件(带 props 的组件)

如果传递的组件需要特定的 props,可以明确指定类型。

interface ChildProps {message: string;
}interface WrapperProps {Component: React.ComponentType<ChildProps>; // 组件需要 ChildProps 类型的 props
}const Wrapper: React.FC<WrapperProps> = ({ Component }) => {return <Component message="Hello from Wrapper" />;
};// 用法
const MyComponent: React.FC<ChildProps> = ({ message }) => <div>{message}</div>;<Wrapper Component={MyComponent} />;

选择适合的类型

用途类型定义
传递 React 组件类型React.ComponentType
传递组件实例或子节点React.ReactNode
传递渲染函数(props: Props) => JSX.Element
传递带特定 props 的组件类型React.ComponentType<Props>

根据实际需求选择合适的类型!


http://www.ppmy.cn/embedded/148575.html

相关文章

概率论 期末 笔记

第一章 随机事件及其概率 利用“四大公式”求事件概率 全概率公式与贝叶斯公式 伯努利概型求概率 习题 推导 一维随机变量及其分布 离散型随机变量&#xff08;R.V&#xff09;求分布律 利用常见离散型分布求概率 连续型R.V相关计算 利用常见连续型分布的计算 均匀分布 正态…

防止私接小路由器

电脑获取到IP地址不是DHCP服务器的IP地址段&#xff0c;导致整个公司网络瘫痪&#xff0c;这些故障现象通常80%原因是私接小路由器导致的&#xff0c;以下防止私接小路由器措施。 一、交换机配置DHCP Sooping DHCP snooping是一种DHCP安全特性&#xff0c;用于防止非法设备获…

公交车信息管理系统:构建智能城市交通的基石

程序设计 本系统主要使用Java语言编码设计功能&#xff0c;MySQL数据库管控数据信息&#xff0c;SSM框架创建系统架构&#xff0c;通过这些关键技术对系统进行详细设计&#xff0c;设计和实现系统相关的功能模块。最后对系统进行测试&#xff0c;这一环节的结果&#xff0c;基本…

深入解析 Apache APISIX

以下是“第一部分&#xff1a;背景与概述”的示例写作内容&#xff0c;供你参考和使用。你可根据实际需求和篇幅进行增删或细化。 一、背景与概述 1. 高性能动态网关的意义 1.1 微服务架构下的网关角色与价值 随着微服务架构在企业级应用中日益普及&#xff0c;系统被拆分为…

Escalate_Linux靶机

Escalate_Linux靶机 前言&#xff1a;集合了多种liunx提权方法的靶场&#xff0c;通过该靶场可以简单的了解liunx提权方法 1&#xff0c;扫描一下端口 80/tcp open http 111/tcp open rpc 2049/udp nfs要知道对方的共享才能挂载 139/445 Samba SMB是一个协议名&#xff0c…

如何编译Opencv +ffmpeg linux 明明安装了ffmpeg但是opencv就是找不到

想要编译opencvffmpeg&#xff1a; 1.安装ffmpeg 随便位置&#xff08;具体看ffmpeg 编译安装&#xff09; 执行下面命令&#xff0c;其中/usr/local/ffmpeg/lib/pkgconfig是你实际的ffmpeg路径 export PKG_CONFIG_PATH$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig2.下载…

基于Spring Boot的建材租赁系统

一、系统背景与目的 随着建筑行业的快速发展&#xff0c;建材租赁需求日益增加。传统的建材租赁管理方式大多依赖于纸质文档或简单的电子表格&#xff0c;不仅效率低下&#xff0c;还容易出现信息遗漏和错误。为了解决这些问题&#xff0c;基于Spring Boot的建材租赁系统应运而…

游戏引擎学习第55天

仓库: https://gitee.com/mrxiao_com/2d_game 介绍 今天的主题是让世界存储真正实现稀疏化&#xff0c;即便当前效率可能并不高。我们计划花一些时间处理这个问题&#xff0c;并探讨相关的成本。稀疏化世界存储是接下来的重要步骤&#xff0c;为此需要逐步实施。 修复 SetCa…