写 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. 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(全称: ...

  2. 协程- gevent模块

    协程 1.什么是协助:在单线程下实现并发效果 2.协程的原理: 通过代码监听IO操作一旦遇到 IO 操作就立刻切换下一个程序 让cpu一直在工作 这样就可以一直占用CPU的效率 提高程序执行效率 切换 ...

  3. MongoDB安全加固,防止数据库攻击删除勒索威胁

    前言: 今天发现前段时间自己搭建的一个系统的MongoDB数据找不到了,觉得很奇妙,然后登上MongoDB数据库发现多了一个名为READ__ME_TO_RECOVER_YOUR_DATA的数据库,里面 ...

  4. 如何用3D流体实现逼真水流效果?

    华为应用市场在2022年HDC大会期间发布了一款3D水流主题,基于华为HMS Core Scene Kit服务能力,展现立体灵动的水流岛屿,可跟随用户指尖实现实时流体波动效果,既趣味又解压. 让变幻莫 ...

  5. vue移动端封装底部导航

    <template> <div class="myfooter flex-betweenCenter"> <router-link tag=" ...

  6. 解读JVM级别本地缓存Caffeine青出于蓝的要诀3 —— 讲透Caffeine的数据驱逐淘汰机制与用法

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 上一篇文章中,我们聊了下Caffein ...

  7. python的grpc环境安装

    环境 ubuntu:bionic的docker image docker run -it ubuntu:bionic python的grpc环境安装 参考grpc官网:https://grpc.io/ ...

  8. GitHub - 电脑经常无法访问GitHub页面

    来自这里 1.打开Dns检测|Dns查询 - 站长工具2.在检测输入栏中输入http://github.com官网3.把检测列表里的TTL值最小的IP输入到host里,并对应写上github官网域名. ...

  9. Java读取文件后文件被占用

    Java读取文件响应后文件一直被占用问题 原因: 由于是封装的函数,请求和响应对象都是 形参地址 虽然在此函数里关闭了输出流,但是由于有返回值,调用未结束,输出流无法提前关闭 解决: 1:调用函数后, ...

  10. s2-007

    漏洞名称 S2-007 CVE-2012-0838 远程代码执行 利用条件 Struts 2.0.0 - Struts 2.2.3 漏洞原理 age来自于用户输入,传递一个非整数给id导致错误,str ...