当前位置: 首页 > news >正文

React使用动态标签名称

最近在一项目里(React + antd)遇到一个需求,某项基础信息里有个图标配置(图标用的是antd的Icon组件),该项基础信息的图标信息修改后,存于后台数据库,后台数据库里存的是antd Icon组件的图标Tag名称,如AreaChartOutlined PieChartOutlined BarChartOutlined 等,另外在展示页面,需要根据该项信息的Tag名称,显示对应的antd图标。

antd 图标的使用方法

正常情况下安装@ant-design/icons依赖后,就可以在页面中使用antd图标,如:

$ npm install @ant-design/icons --save
import { HomeOutlined } from '@ant-design/icons';const App: React.FC = () => (<Space><HomeOutlined /></Space>
);

但是如果页面中,图标的Tag名称不确定,又如何使用呢?

方案1. 使用React.createElement创建元素

关于React.createElement的详细用法,可以阅读文档:https://react.dev/reference/react/createElement
React.createElement(type, props, ...children) 包含三个参数:

  • type: 该参数必须为一个有效的React组件类型,例如,其可以是一个Tag名称(如div或者span),也可以是一个React组件(一个函数、一个类或者一个特殊组件如Fragment)
  • props: 该参数应是一个对象或者null。如果传递null,则会当成空对象处理。React会创建一个元素,该元素属性与参数props相匹配。
  • optional …children: 可选参数children。可以传递0个、1个或多个。其可以是ReactNode,包含React组件,字符串,数字,ReactNode,空节点(null, undefined, true, false),或者ReactNode数组。

知道React.createElement用法之后,我们可以进行简单的尝试,代码如下:

import React from "react";
import "./index.css";
import * as Icons from "@ant-design/icons"; // 注意要先引入icons
import { Space } from "antd";function customIcon(tagName: string) {return React.createElement(Icons[tagName], {}, null);
}const App: React.FC = () => (<Space>{customIcon("AreaChartOutlined")}{customIcon("PieChartOutlined")}{customIcon("BarChartOutlined")}</Space>
);export default App;

完整代码可以在codesandbox里查看:https://codesandbox.io/p/sandbox/react-createelement-chuang-jian-dong-tai-yuan-su-3hndf2?file=%2Fdemo.tsx%3A1%2C1
在codesandbox里我们可以看到,效果和我们预想的一样,正常显示了三个图标:
三个图标正常显示

方案2. 使用自定义Tag Name

但是对于上述方法,个人感觉有一点点的繁琐。
在一番搜索之下,看到React官方文档里有这么一句话:(链接:https://legacy.reactjs.org/docs/jsx-in-depth.html#user-defined-components-must-be-capitalized)

When an element type starts with a lowercase letter, it refers to a built-in component like

or and results in a string ‘div’ or ‘span’ passed to React.createElement. Types that start with a capital letter like compile to React.createElement(Foo) and correspond to a component defined or imported in your JavaScript file.

大意是说Tag名称如果以小写开头,则会指向内置的html组件,例如<div> 或者 <span>,结果将会通过React.createElement创建对应元素,其中type参数为'div'或者'span',如: React.createElement('div');如果Tag名称如果以大写开头,例如<Foo />,结果则会通过React.createElement(Foo)创建对应的元素,对应的组件则必须在js文件中引入。(这段翻译是我瞎掰的,手动狗头)。
所以我们可以将上面代码中的customIcon方法简化如下:

function customIcon(tagName: string) {const Icon = Icons[tagName]; // 变量名必须以大写字母开头return <Icon />;
}

完整代码如下:

import React from "react";
import "./index.css";
import * as Icons from "@ant-design/icons"; // 注意要先引入icons
import { Space } from "antd";function customIcon(tagName: string) {// return React.createElement(Icons[tagName], {}, null);const Icon = Icons[tagName]; // 变量名必须以大写字母开头return <Icon />;
}const App: React.FC = () => (<Space>{customIcon("AreaChartOutlined")}{customIcon("PieChartOutlined")}{customIcon("BarChartOutlined")}</Space>
);export default App;

完整代码可以在codesandbox里查看:https://codesandbox.io/p/sandbox/custom-tag-name-h7zhyt?file=%2Fdemo.tsx%3A1%2C1
在codesandbox里我们可以看到,效果和之前的效果一模一样,都是显示三个图标。



扩展阅读:
2022年中华人民共和国县以上行政区划代码
react + antd实现动态切换主题功能(适用于antd5.x版本)
常用的几款Vue移动端UI推荐

相关文章:

React使用动态标签名称

最近在一项目里&#xff08;React antd&#xff09;遇到一个需求&#xff0c;某项基础信息里有个图标配置&#xff08;图标用的是antd的Icon组件&#xff09;&#xff0c;该项基础信息的图标信息修改后&#xff0c;存于后台数据库&#xff0c;后台数据库里存的是antd Icon组件…...

Java异常篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、 Excption与Error包结构二、Thow与thorws区别三、Error与Exception区别?四、error和exception有什么区别前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女…...

微服务(1)

目录 1.什么是微服务&#xff1f;谈谈你对微服务的理解&#xff1f; 2.什么是Spring Cloud&#xff1f; 3.Springcloud中的组件有哪些&#xff1f; 3.具体说说SpringCloud主要项目&#xff1f; 5.SpringCloud项目部署架构&#xff1f; 1.什么是微服务&#xff1f;谈谈你对微…...

195.【2023年华为OD机试真题(C卷)】5G 网络建设(最小生成树—JavaPythonC++JS实现)

请到本专栏顶置查阅最新的华为OD机试宝典 点击跳转到本专栏-算法之翼:华为OD机试 🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 【2023年华为OD机试真题(C卷)】5G 网络建设(最小生…...

2024年1月1日答案

a)i. V B B V C C 16 V V_{BB} V_{CC} 16V VBB​VCC​16V R t h R B R E R B R E 10 k Ω 3 k Ω 10 k Ω 3 k Ω ≈ 2.31 k Ω R_{th} \frac{R_B \times R_E}{R_B R_E} \frac{10k\Omega \times 3k\Omega}{10k\Omega 3k\Omega} \approx 2.31k\Omega Rth​RB​R…...

【算法】dp题单

题单链接&#xff1a; https://vjudge.net/contest/574209#overview 目录 1. 洛谷 P1020 导弹拦截 &#xff08;dp二分Dilworth 定理&#xff09; 2. P1439 最长公共子序列&#xff08;二分求最长公共子序列&#xff09; 3. 洛谷 P1854 花店橱窗布置 &#xff08;线性dp 用…...

Verilog视频信号图形显示 FPGA(iCE40)

您需要一块带视频输出的 FPGA 板。 我们将在 640x480 下工作&#xff0c;几乎任何视频输出都可以在此像素工作。 它有助于轻松地对 FPGA 板进行编程并相当熟悉 Verilog。 如果您没有开发板&#xff0c;请不要担心&#xff0c;您可以使用 Verilator 模拟器。 材料 Lattice iCE…...

【LeetCode 面试经典150题】26. Remove Duplicates from Sorted Array 在有序数组中移除重复元素

26. Remove Duplicates from Sorted Array 题目大意 Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appears only once. The relative order of the elements should be kept the same. Then …...

linux系统下sql脚本的执行与导出

terminal中执行 执行 mysql -u [username] -p -D [databasename] < [XXX.sql] 导出 mysql -u [username] -p [datbasename] > [XXX.sql] 导出的数据库名自定义。 mysql -u [username] -p [databasename] [tablename] > [xxx.sql] 导出表名自定义 mysql shell 执行 …...

MyBatis学习一:快速入门

前言 公司要求没办法&#xff0c;前端也要了解一下后端知识&#xff0c;这里记录一下自己的学习 学习教程&#xff1a;黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 文档&#xff1a; https://mybatis.net.cn/index.html MyBatis 快速入门&#xf…...

零售业物流这个防漏水技术,居然没有翻车!

随着科技的不断发展&#xff0c;水浸监控系统在各个领域得到了广泛应用。水浸监控不仅仅是为了保护建筑结构和设备&#xff0c;更是为了防范因水灾引起的生命安全和财产损失。 因此&#xff0c;为了有效预防和应对水浸事件&#xff0c;水浸监控系统应运而生&#xff0c;成为各行…...

主浏览器优化之路1——你现在在用的是什么浏览器?Edge?谷歌?火狐?360!?

上一世&#xff0c;我的浏览器之路 引言为什么要用两个浏览器为什么一定要放弃火狐结尾给大家一个猜数字小游戏&#xff08;测运气&#xff09; 引言 小时候&#xff0c;我一开始上网的浏览器是2345王牌浏览器吧&#xff0c; 因为上面集成了很多网站&#xff0c;我记得上面有7…...

gitlab请求合并分支

直接去看原文: 原文链接:Gitlab合并请求相关流程_source branch target branch-CSDN博客 --------------------------------------------------------------------------------------------------------------------------------- 入口&#xff1a; 仓库控制台的这两个地方都…...

使用Vue3开发学生管理系统模板1

环境搭建 通过解压之前《Vue3开发后台管理系统模板》的代码&#xff0c;我们能够得到用户增删改查的页面&#xff0c;我们基于用户增删改查的页面做进一步的优化。 创建学生增删改查页面 第一步&#xff1a;复制用户增删改查页面&#xff0c;重命名为StudentCRUD.vue <…...

【cmake实战:番外】交叉编译——Linaro

【cmake实战&#xff1a;番外】交叉编译——Linaro 一、交叉编译1、交叉编译简介2、为什么会有交叉编译 二、交叉编译链1、什么是交叉编译链2、交叉编译工具 三、Linaro1、下载2、解压3、demo3.1、toolchain_aarch64.cmake3.2、CMakeLists.txt3.3、main.cpp 4、执行编译5、查看…...

2024年年初Java5年实战面试题(北京)

高阶篇&#xff1a; 一、在面对千万条并发请求的情况下&#xff0c;如果数据库频繁查询导致崩溃&#xff0c;可以采取以下措施来解决问题: 1.缓存数据:可以使用缓存技术来减少对数据库的查询次数。将经常查询的数据存储在缓存中&#xff0c;例如使用Redis等内存数据库&#xff…...

【Apache-2.0】springboot-openai-chatgpt超级AI大脑产品架构图

springboot-openai-chatgpt: 一个基于SpringCloud的Chatgpt机器人&#xff0c;已对接GPT-3.5、GPT-4.0、百度文心一言、stable diffusion AI绘图、Midjourney绘图。用户可以在界面上与聊天机器人进行对话&#xff0c;聊天机器人会根据用户的输入自动生成回复。同时也支持画图&a…...

如何在iPhone设备中查看崩溃日志

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…...

对接第三方接口鉴权(Spring Boot+Aop+注解实现Api接口签名验证)

前言 一个web系统&#xff0c;从接口的使用范围也可以分为对内和对外两种&#xff0c;对内的接口主要限于一些我们内部系统的调用&#xff0c;多是通过内网进行调用&#xff0c;往往不用考虑太复杂的鉴权操作。但是&#xff0c;对于对外的接口&#xff0c;我们就不得不重视这个…...

微服务-理论(CAP,一致性协议)

CAP理论 关于CAP理论的介绍可以直接看这篇文章 CAP分别是什么&#xff1f; 一致性&#xff08;Consistency 一致性包括强一致性&#xff0c;弱一致性&#xff0c;最终一致性。 一致性其实是指数据的一致性&#xff0c;为什么数据会不一致呢&#xff1f; 如上面这张图&…...

GPU加速时序驱动布局优化技术解析

1. 时序驱动布局优化&#xff1a;GPU加速的创新实践 在超大规模集成电路&#xff08;VLSI&#xff09;物理设计中&#xff0c;时序驱动布局&#xff08;Timing-Driven Placement&#xff09;一直是决定芯片性能的关键环节。随着工艺节点不断缩小&#xff0c;设计复杂度呈指数级…...

JAVA校园跑腿代买代拿社区-校园跑腿小程序的后端代码示例

&#x1f3c3; JAVA校园跑腿系统 - 后端完整代码示例校园跑腿代买代拿 | Spring Boot MyBatis Plus MySQL Redis&#x1f4e6; 一、项目依赖 pom.xmlxml<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/…...

国产多模态大模型部署利器:深度解析陈天奇技术栈

国产多模态大模型部署利器&#xff1a;深度解析陈天奇技术栈 引言 在国产大模型“百模大战”的喧嚣浪潮中&#xff0c;我们的目光常常被那些能说会道、能文能图的多模态大模型本身所吸引。然而&#xff0c;一个同样关键却容易被忽视的问题是&#xff1a;如何让这些动辄数百亿…...

Laravel Permission 缓存系统终极指南:如何构建高性能多级缓存策略

Laravel Permission 缓存系统终极指南&#xff1a;如何构建高性能多级缓存策略 【免费下载链接】laravel-permission Associate users with roles and permissions 项目地址: https://gitcode.com/gh_mirrors/la/laravel-permission Laravel Permission 是一个功能强大的…...

本地视频怎么去水印?2026实测去水印方法汇总,本地视频去水印软件推荐

本地视频怎么去水印&#xff1f;2026实测去水印方法汇总&#xff0c;本地视频去水印软件推荐 视频里的水印是很多人在整理或剪辑素材时遇到的高频问题。有时是平台在视频上自动打上的 Logo&#xff0c;有时是录屏工具留下的品牌标识&#xff0c;还有时是拍摄 App 在画面角落打的…...

AI与地缘政治双重冲击下,内存市场产能大迁移与供应链危机

1. 风暴之眼&#xff1a;当AI狂潮撞上地缘断供如果你最近想给电脑加条内存或者换个固态硬盘&#xff0c;大概率会被价格吓一跳。这不仅仅是简单的“涨价”&#xff0c;而是整个存储市场的底层逻辑正在被两股巨力彻底重塑。一边是AI数据中心对高性能内存近乎贪婪的吞噬&#xff…...

一键安装器设计指南:从Shell脚本到自动化部署架构

1. 项目概述与核心价值最近在折腾一些自动化部署和脚本管理时&#xff0c;发现了一个挺有意思的项目&#xff1a;viomat7064/openclaw-installer。乍一看这个仓库名&#xff0c;你可能会联想到某种“爪子”工具&#xff0c;其实它本质上是一个针对特定开源软件或服务的一键式安…...

GPT-4 Turbo访问权、优先响应、高级数据分析——ChatGPT Plus五大隐藏权益深度拆解,92%用户根本没用全

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ChatGPT Plus订阅值不值得买 ChatGPT Plus 提供每月 $20 的固定订阅服务&#xff0c;主打 GPT-4 模型访问、优先响应队列、文件上传解析&#xff08;PDF/CSV/TXT 等&#xff09;及自定义 GPTs 功能。是…...

[特殊字符] 科普:论文查重的AI原理是什么?这个免费工具把“黑科技“讲明白了

同学们好&#xff0c;我是你们的论文写作科普博主。 今天不聊怎么选题&#xff0c;不聊怎么写文献综述&#xff0c;咱们来聊一个99%的同学都踩过坑的环节——查重。 先问大家一个问题&#xff1a;你知道查重到底是怎么查的吗&#xff1f; 很多同学以为查重就是"把你的文…...

castAR混合现实头显:从光学投影到空间锚定的技术解析

1. 项目概述&#xff1a;从Kickstarter到技术现实&#xff0c;castAR的独特魅力2013年&#xff0c;当Oculus Rift在虚拟现实领域掀起第一波热潮时&#xff0c;一封来自技术爱好者的邮件&#xff0c;将一个名为castAR的项目推到了我的视野中心。这不仅仅是一个头戴显示设备&…...