Skip to content

@iconify/vue

官网:https://iconify.design/docs/icon-components/vue/

iconify 是功能最丰富的图标框架。可以与任何图标库一起使用的统一图标框架。开箱即用的功能包括 80 多个图标集和超过 70,000 个图标。官方为了便于使用 iconify 网站上的图标,提供了@iconify/vue 组件,供大家使用 SVG framework,支持在线和离线 2 种方式使用。离线方式需要下载对应图标集合 json 数据,然后先从本地资源中加载,如果没有找到,通过 API 从线上下载资源,并进行浏览器缓存。

@iconify/vue 是一个功能非常强大的组件,支持图标名称动态渲染和静态渲染,正好弥补 vite-plugin-svg-icons 功能缺陷。

依赖安装

sh
pnpm install @iconify/vue -D

使用例子

tsx
import { Icon } from '@iconify/vue';
<Icon icon="mdi-light:home" />;

自定义组件

虽然@iconify/vue 也支持本地 svg,但逐个配置非常麻烦,所以结合 vite-plugin-svg-icons 和@iconify/vue,我们创建一个自定义组件,使其不仅支持本地静态动态 Svg 渲染,还支持显示静态动态 Svg 渲染。下面是自定义组件代码:

vue
<template>
  <template v-if="localIcon">
    <svg aria-hidden="true" width="1em" height="1em" v-bind="bindAttrs">
      <use :xlink:href="symbolId" fill="currentColor" />
    </svg>
  </template>
  <template v-else>
    <Icon v-if="icon" :icon="icon" v-bind="bindAttrs" />
  </template>
</template>

<script setup lang="ts" name="SvgIcon">
import { Icon } from '@iconify/vue';
// eslint-disable-next-line vue/no-setup-props-destructure
const { icon, localIcon } = defineProps<{
  /** iconify线上图标名称 */
  icon?: string;
  /** 本地svg的文件名称 */
  localIcon?: string;
}>();
// 获取组件传递的属性
const attrs = useAttrs();
// 计算绑定属性
const bindAttrs = computed<{ class: string; style: string }>(() => ({
  class: (attrs.class as string) ?? 'w-24px h-24px',
  style: attrs.style as string,
}));
// 计算本地svg动态的symbolId
const symbolId = computed(() => {
  const icon = localIcon ?? 'no-icon';
  return `#icon-local-${icon}`;
});
</script>

此时,便可以灵活的渲染本地和线上 iconify 网站上的 Svg 图标,使用例子如下:

html
本地Svg:<SvgIcon localIcon="logo"></SvgIcon> iconify线上Svg:<SvgIcon
  icon="healthicons:fhir-logo"
  class="w-24px h-24px"
></SvgIcon>