Cirry's Blog

Navie Ui中动态渲染SVG图标

Apr 18, 2024
技术 vue
3分钟
444字

起因

在开发一些个人项目的时候,我非常喜欢使用一个开源图标库Remix Icon,这次在开发文件服务器的时候也使用了这个库,我只是单纯的觉得caddy和nginx自带的文件服务UI不好看,所以就做了一个简易版本的。

当我按照平常一样的使用方式:

安装

npm install remixicon --save

使用

main.js
import 'remixicon/fonts/remixicon.css'

文件服务一般都是非常小和简单的页面的,当我打包了之后查看打包文件大小,其中remixicon占用了非常大的空间。

default

改进

Remix Icon中在vue3中还有专门的引入方式:

安装

npm install @remixicon/vue

使用

<script setup lang="ts">
import { RiHeartFill } from "@remixicon/vue";
</script>
<template>
<RiHeartFill size="36px" color="red" className="my-icon" />
</template>

这是最普通的使用方式,但是我的使用场景比较复杂,我需要根据后台发来的数据来判断应该显示什么图标。

示例

extIcon.js
import {
RiFolder3Fill,
RiImageFill,
RiFileGifFill,
} from "@remixicon/vue"
const iconClass = {
dir: RiFolder3Fill,
png: RiImageFill,
gif: RiImageFill,
}
/**
* 获取对应文件类型的图标样式
* @param {string} extname 文件后缀名
* @param {string} type 文件类型: image | doc | music | video | audio | code | default
5 collapsed lines
* @returns
*/
export const getIconClass = ({ extname, type }) => {
return { svg: iconClass[extname], color: `text-color-${type}` }
}
DataTable.vue
<script setup>
function renderIcon({extname, type}) {
let iconClass = getIconClass({extname, type})
return () => h(iconClass.svg, {
class: iconClass.color,
size: '20px'
});
}
</script>
<template>
<component :is="renderIcon({ extname: item.ext, type: item.type })"></component>
</template>

这样就这可以根据传入的值来判断需要显示什么图标了。

改用这种方式来引入Svg图标之后,再来看看打包的大小变化吧,舒服多了。

default

知识点

这里有两个知识点,一个是渲染函数h()的使用方法,一个是组件component的使用方法。

本文标题:Navie Ui中动态渲染SVG图标
文章作者:Cirry
发布时间:Apr 18, 2024
感谢大佬送来的咖啡☕
alipayQRCode
wechatQRCode
总访问量
总访客数人次