写 TSX 的目的

element-plus 图标集有很多,但有时需要动态使用某个图标,把所有可能用到的图标都列举出来,通过 v-if 在组件中决定到底渲染哪一个,很费时。

.vue 单文件组件中做不到的,可以尝试用 TSX 和渲染函数来做。比如,我想做一个底部有文字的图标,其实可以通过插槽把图标插入到组件中:

<div class="header f-c-s">
<TextIcon icon="menu" :icon-size="2" :text-size="1" />
</div>

这个组件我只需要传递一个 props icon 指定图标的名称即可使用所有 element-plus 图表中的其中一个。

配置 TSX

cnpm i @vitejs/plugin-vue-jsx -D
// vite.config.ts
import vue from "@vitejs/plugin-vue";
import { defineConfig } from "vite";
import vueJsx from "@vitejs/plugin-vue-jsx"; export default defineConfig({
plugins: [
vue(),
vueJsx()
]
});

TSX 创建组件

import { defineComponent, resolveComponent, h } from "vue";

function isText(props: any) {
if (props.text) {
return (
<div class="text mt-1" style={{ fontSize: props.textSize + "rem" }}>
{props.text}
</div>
);
}
} export default defineComponent({
props: {
icon: {
type: String,
required: true
},
text: {
type: String,
default: ""
},
iconSize: {
type: Number,
default: 1
},
textSize: {
type: Number,
default: 1
}
},
setup(props, ctx) {
// resolveComponent 接收字符串,解析对应的 element-plus 图标组件
const elIcon = resolveComponent(props.icon);
// h 函数渲染 elIcon 组件
return () => (
<div class="i-icon text-center">
<div class="f-c-c">
<el-icon style={{ fontSize: props.iconSize + "rem" }}>{h(elIcon)}</el-icon>
</div>
{isText(props)}
</div>
);
}
});

把图标的组件名称,通过 props 传递给 TextIcon 组件,通过 resolveComponent 解析组件,h 函数渲染该组件。

注意事项

在 TSX 中使用 Element-Plus 组件要全部导入,不能按需自动导入,否则 resolveComponent 不能解析组件:

// main.ts

// import vue
import { createApp } from "vue";
import App from "./App.vue"; // import element-plus
import ElementPlus from "element-plus";
import "element-plus/dist/index.css"; const app = createApp(App); // all element icons
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component);
} app.use(ElementPlus);
app.mount("#app");

总结

.vue 组件中,模板不能通过一个字符串解析组件,我们可以通过 TSX 来做,利用 resolveComponent 函数接收一个组件的名称(字符串)进行渲染,且该组件是已经全局注册过的。总而言之,TSX 非常灵活,在万不得已的情况下才用,一般 .vue 模板组件已经够用了。

VueTSX 动态使用 element-plus 图标的更多相关文章

  1. C# 动态绘制任务栏图标的实现

    通常我们在做一个应用时会遇到这样的需求:将收到的消息条数显示到任务栏,比如如下的效果 怎么实现呢? 答案是采用WindowsAPICodePack实现,具体参见:Windows 7 任务栏开发 之 覆 ...

  2. 给element添加自定义图标

    element为我们提供了丰富的好用的组件,图标的样式也很多,但还是有一些常用的图标没有在官方图标库里边,比如说微信.淘宝.支付宝等等.那么如何把我们需要的图标添加到进去呢? 因为element有官方 ...

  3. ajax动态加载的图标

    http://www.ajaxload.info/ 这个网站可以动态生成ajax加载样式的小图片,git格式,挺不错推荐给大家

  4. 动态修改PE文件图标(使用UpdateResource API函数)

    PE文件的图标存储在资源文件中,而操作资源要用到的API函数就是UpdateResource首先我们需要先了解一下ICO格式,参考资料:http://www.moon-soft.com/program ...

  5. 不需要图片,css+svg绘制动态loading加载图标

    1.html 部分: <div id="refershDiv" class="refershDiv"> <svg xmlns="ht ...

  6. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式

    前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...

  7. 转: angularjs 指令中动态编译的方法(适用于有异步请求的情况) 内嵌指令无效

    angular的坑很多 例子: 在directive的link中有一个$http请求,当请求完成后根据返回的值动态做element.append('......');这个操作, 能显示没问题,可问题是 ...

  8. Delphi资源文件(全面分析之位图、光标、图标、AVI、JPEG、Wave)

    几乎每个Windows应用程序都使用图标.图片.光标等资源.资源是程序的一部分,但是它是不可执行代码.下面我们就详细介绍资 源文件在Delphi5中建立和使用方法.  1.把资源放到Exe文件的优点  ...

  9. easyUI tree 自定义图标

    文章转载自: https://blog.csdn.net/zhlantian/article/details/52913115 近期由于项目中需要使用easyui tree树形列表,并在系统中动态配置 ...

  10. vue中渲染页面,动态设置颜色

    for循环中动态设置页面的图标或者字体颜色与循环中且套循环 :style="{'color':items.color}" 案例代码: html中 <div class=&qu ...

随机推荐

  1. 【实时数仓】Day02-DWD、DIM层数据准备:各层职能、行为日志DWD层、业务日志DWD层及分流(Phoenix和HBASE)

    一.需求分析及实现思路 1.分层需求 建立数仓目的:增加数据计算的复用性 可以从半成品继续加工而成 从kafka的ODS层(数据一开始就读到了kafka)读用户行为数据和业务数据,并写回到kafka的 ...

  2. 1.5 HDFS分布式文件系统-hadoop-最全最完整的保姆级的java大数据学习资料

    目录 1.5 HDFS分布式文件系统 1.5.1 HDFS 简介 1.5.2 HDFS的重要概念 1.5.3 HDFS架构 1.5 HDFS分布式文件系统 1.5.1 HDFS 简介 HDFS(全称: ...

  3. SQL注入问题、视图、触发器、事物、存储过程、函数、流程控制、索引相关概念、索引数据结构、慢查询优化、

    目录 SQL注入问题 视图 触发器 事物 存储过程 函数 流程控制 索引相关概念 索引数据结构 慢查询优化 测试装备 联合索引 全文检索 插入数据 更新数据 删除数据 主键 外键 重命名表 事物 安全 ...

  4. CH32V307以太网(芯片内部10M)

    用过WCH的CH579M或者CH563的话,就会发现CH32V307这个自带的10M以太网代码编写与前两颗芯片流程十分相似.部分区别就在于初始化方面. 代码流程依旧按照 初始化--->等待PHY ...

  5. 【博学谷学习记录】超强总结,用心分享|前端CSS总结(一)

    CSS总结(一) shift+alt,选中多行 外链式 <link rel="stylesheet" href="./my.css"> 1 选择器 ...

  6. PKUSC2022 润摆寄

    Day 0 模拟赛的题目竟是 寄 摆 润!预示着我的 PKUSC. Day 1 猜中主角(指九条可怜)原来都是芳文厨 看错时间以为考 \(5h\),于是告诉自己 优势在我可以慢慢做. T1 很显然的 ...

  7. JUC并发编程详解(通俗易懂)

    一.JUC简介 在Java5.0提供了java.util.concurrent包,简称JUC,即Java并发编程工具包.JUC更好的支持高并发任务. 具体的有以下三个包: java.util.conc ...

  8. AtCoder Beginner Contest 282 G - Similar Permutation

    套路题 题意 求有多少个 \(1\) 到 \(n\) 的排列满足恰有 \(k\) 对在排列中相邻的数满足前小于后 \(2 \leq n \leq 500, 0 \leq k \leq (n - 1)\ ...

  9. API 网关的功能用途及实现方式

    1. API 网关诞生背景 前言 API 经济生态链已经在全球范围覆盖, 绝大多数企业都已经走在数字化转型的道路上,API 成为企业连接业务的核心载体, 并产生巨大的盈利空间.快速增长的 API 规模 ...

  10. node.js接收前端上传的文件并保存到其他位置+后端代码支持进度条

    一:直接上传文件,放入body里 1.前端代码 <input type="file" onchange="sendFiles(this.files)"&g ...