WHAT - React Polymorphic Components

目录

  • Polymorphic Components
    • 定义
    • 优势
    • 使用场景
    • 实现示例
  • Regular Components
    • 优势
    • 实现示例
  • 比较总结

In the world of React components, a polymorphic component is a component that can be rendered with a different container element / node.

Polymorphic componentsregular components 在 React 中是两种不同的组件设计方式,各自有其优缺点和适用场景。

以下是它们的详细比较:

Polymorphic Components

定义

Polymorphic components 是指那些可以根据 props 动态决定其渲染的 HTML 元素或其他组件的组件。它们提供了极大的灵活性和可重用性。

优势

  1. 灵活性:

    • 可以渲染不同类型的元素或组件,而不需要创建多个类似的组件。
    • 提供了一种方式,通过简单的配置来改变组件的渲染逻辑。
  2. 代码复用:

    • 减少了重复代码的编写,因为可以通过单个组件处理多种渲染需求。
  3. 类型安全:

    • 通过 TypeScript 等工具,可以确保在使用 polymorphic components 时保持类型安全。

使用场景

  • 需要创建一个组件,该组件可能会渲染不同类型的 HTML 元素,例如按钮、链接、div 等。
  • 需要为多个类似的组件提供统一的逻辑和样式,同时允许根据需求自定义渲染的元素。

实现示例

import React from 'react';type PolymorphicComponentProps<E extends React.ElementType> = {as?: E;children: React.ReactNode;
} & React.ComponentPropsWithoutRef<E>;const PolymorphicComponent = <E extends React.ElementType = 'div'>({as,children,...restProps
}: PolymorphicComponentProps<E>) => {const Element = as || 'div';return <Element {...restProps}>{children}</Element>;
};// 使用示例
<PolymorphicComponent as="button" onClick={() => alert('Button clicked!')}>Click Me
</PolymorphicComponent>;<PolymorphicComponent as="a" href="https://example.com">Go to Example
</PolymorphicComponent>;

Regular Components

定义:
Regular components 是指那些在创建时固定渲染特定 HTML 元素或其他组件的组件。它们通常不会根据 props 动态改变渲染的元素类型。

优势

  1. 简单易懂:

    • 固定的渲染逻辑使得组件更易于理解和维护。
    • 适合不需要动态改变渲染逻辑的场景。
  2. 类型安全:

    • 更容易管理组件的 props 和类型,因为渲染的元素类型是固定的。

使用场景:

  • 需要创建特定功能的组件,例如按钮、输入框、列表项等。
  • 组件的渲染逻辑和元素类型在应用的整个生命周期中都是固定的。

实现示例

import React from 'react';type ButtonProps = {onClick: () => void;children: React.ReactNode;
};const Button: React.FC<ButtonProps> = ({ onClick, children }) => {return <button onClick={onClick}>{children}</button>;
};type LinkProps = {href: string;children: React.ReactNode;
};const Link: React.FC<LinkProps> = ({ href, children }) => {return <a href={href}>{children}</a>;
};// 使用示例
<Button onClick={() => alert('Button clicked!')}>Click Me</Button>;<Link href="https://example.com">Go to Example</Link>;

比较总结

  • 灵活性:

    • Polymorphic components 提供了更高的灵活性,可以根据需求动态渲染不同的元素。
    • Regular components 固定渲染特定元素,灵活性较低。
  • 代码复用:

    • Polymorphic components 可以减少重复代码,通过一个组件处理多种需求。
    • Regular components 通常需要为不同需求创建多个组件,代码复用较低。
  • 复杂性:

    • Polymorphic components 由于其动态特性,可能会增加组件的复杂性,特别是在处理类型和 props 时。
    • Regular components 更简单直接,易于理解和维护。
  • 类型安全:

    • Polymorphic components 需要更复杂的类型定义以确保类型安全。
    • Regular components 由于渲染逻辑固定,类型管理相对简单。

选择使用 polymorphic components 还是 regular components 取决于具体的需求。如果需要高灵活性和代码复用,polymorphic components 是更好的选择;如果需要简单明确的组件结构,regular components 更适合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386594.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地球磁场的形成、变迁、特点

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

Unity多客户端位置同步信息

书接上文&#xff0c;有了一个基本的网络同步消息的服务器&#xff0c;客户端这边其实要做的工作就简单许多。 如果对位置信息的保密程度没那么高的话&#xff0c;可以放在客户端处理这部分的逻辑。 即一个客户端移动的时候&#xff0c;另一个客户端跟着移动&#xff0c;基本…

【电控笔记-xuan】各种估测器扰动估计性能比较

各种扰动观测器观测结果 蓝色: 扰动值 隆博戈估测器扰动补偿 论文53disturb扰动补偿 2order eso 观测

LabVIEW学习-LabVIEW处理带分隔符的字符串从而获取数据

带分隔符的字符串很好处理&#xff0c;只需要使用"分隔符字符串至一维字符串数组"函数或者"一维字符串数组至分隔符字符串"函数就可以很轻松地处理带分隔符地字符串。 这两个函数所在的位置为&#xff1a; 函数选板->字符串->附加字符串函数->分…

APT 安装软件详细教程

文章目录 APT 安装软件详细教程APT 概述APT 的基本命令APT 命令详解安装软件包更新和升级软件包删除软件包搜索和查找软件包管理软件包依赖清理软件包缓存APT 配置软件源配置自定义软件源常见问题及解决方案解决软件包依赖问题处理软件源错误其他常见问题使用 APT 的最佳实践总…

在Postman中引用JS库

前言 在做接口测试时&#xff0c;出于安全因素&#xff0c;请求参数需要做加密或者加上签名才能正常请求&#xff0c;例如&#xff1a;根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的&#xff0c;即在请求前使用JavaScript脚本对…

昇思MindSpore学习入门-自动混合精度

混合精度&#xff08;Mix Precision&#xff09;训练是指在训练时&#xff0c;对神经网络不同的运算采用不同的数值精度的运算策略。在神经网络运算中&#xff0c;部分运算对数值精度不敏感&#xff0c;此时使用较低精度可以达到明显的加速效果&#xff08;如conv、matmul等&am…

OSI七层模型详解

OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互连。 一般都叫OSI参考模型&#xff0c;是ISO组织在1985年研究的网络互连模型。该体系结构标准定义了网络互连的七层框架&#xff08;物理层、数据链路层、网络层、传输层、会话层、…

[玄机]流量特征分析-常见攻击事件 tomcat

[玄机]流量特征分析-常见攻击事件 tomcat 题目做法及思路解析&#xff08;个人分享&#xff09; Tomcat是一个开源的Java Servlet容器&#xff0c;它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;提供了一个运行这些应用程序的Web服务器环境。Tomcat由A…

go程序在windows服务中优雅开启和关闭

本篇主要是讲述一个go程序&#xff0c;如何在windows服务中优雅开启和关闭&#xff0c;废话不多说&#xff0c;开搞&#xff01;&#xff01;&#xff01;   使用方式&#xff1a;go程序 net服务启动 Ⅰ 开篇不利 Windows go进程编译后&#xff0c;为一个.exe文件,直接执行即…

语言转文字

因为工作原因需要将语音转化为文字&#xff0c;经常搜索终于找到一个免费的好用工具&#xff0c;记录下使用方法 安装Whisper 搜索Colaboratory 右上方链接服务 执行 !pip install githttps://github.com/openai/whisper.git !sudo apt update && sudo apt install f…

NSSRound#4 Team

[NSSRound#4 SWPU]1zweb 考察&#xff1a;phar的反序列化 1.打开环境&#xff0c;审计代码 1.非预期解 直接用file伪协议读取flag,或直接读取flag file:///flag /flag 2.正常解法 用读取文件读取index.php,upload.php的源码 index.php: <?php class LoveNss{publi…

hadoop学习(一)

一.hadoop概述 1.1hadoop优势 1&#xff09;高可靠性&#xff1a;Hadoop底层维护多个数据副本&#xff0c;即使Hadoop某个计算元素或存储出现故障&#xff0c;也不会导致数据的丢失。 2&#xff09;高扩展性&#xff1a;在集群间分配任务数据&#xff0c;可方便扩展数以千计…

c++ 内存管理(newdeletedelete[])

因为在c里面新增了类&#xff0c;所以我们在有时候会用malloc来创建类&#xff0c;但是这种创建只是单纯的开辟空间&#xff0c;没有什么默认构造的。同时free也是free的表面&#xff0c;如果类里面带有指针指向堆区的成员变量就会free不干净。 所以我们c增加了new delete和de…

Python --Pandas库基础方法(2)

文章目录 Pandas 变量类型的转换查看各列数据类型改变数据类型 重置索引删除行索引和切片seriesDataFrame取列按行列索引选择loc与iloc获取 isin()选择query()的使用排序用索引排序使用变量值排序 修改替换变量值对应数值的替换 数据分组基于拆分进行筛选 分组汇总引用自定义函…

springcloud RocketMQ 客户端是怎么走到消费业务逻辑的 - debug step by step

springcloud RocketMQ &#xff0c;一个mq消息发送后&#xff0c;客户端是怎么一步步拿到消息去消费的&#xff1f;我们要从代码层面探究这个问题。 找的流程图&#xff0c;有待考究。 以下我们开始debug&#xff1a; 拉取数据的线程&#xff1a; PullMessageService.java 本…

126M全球手机基站SHP数据分享

数据是GIS的血液&#xff01; 我们在《2.8亿东亚五国建筑数据分享》一文中&#xff0c;为你分享过东亚五国建筑数据。 现在再为你分享全球手机基站SHP数据&#xff0c;你可以在文末查看该数据的领取方法。 全球手机基站SHP数据 全球手机基站数据是OpenCelliD团队创建由社区…

【Spring Cloud】Sleuth +Zinkin 实现链路追踪并持久化的解决方案

文章目录 前言链路追踪介绍Sleuth入门Sleuth介绍TraceSpanAnnotation Sleuth入门1、引入依赖2、修改配置文件3、网关路由配置4、演示 Zipkin的集成ZipKin介绍ZipKin服务端安装Zipkin客户端集成1、添加依赖2、添加配置3、访问微服务4、演示 Zipkin数据持久化使用mysql实现数据持…

现代Java开发:使用jjwt实现JWT认证

前言 jjwt 库 是一个流行的 Java 库&#xff0c;用于创建和解析 JWT。我在学习spring security 的过程中看到了很多关于jwt的教程&#xff0c;其中最流行的就是使用jjwt实现jwt认证&#xff0c;但是教程之中依然使用的旧版的jjwt库&#xff0c;许多的类与方法已经标记弃用或者…

多家隧道代理价格:阿布云、快代理、小象代理、熊猫代理和亿牛云……

随着奥运的热度攀升&#xff0c;各大品牌也在抓紧时机赶上这波奥运热潮&#xff0c;随之而来的大量数据信息收集和分析工作也接踵而至&#xff0c;在这一数据采集过程中&#xff0c;HTTP代理的质量和价格对企业的效率和成本调控重要性不言而喻。我们大部分人在日常购买产品的时…