首页 > 其他分享 >vue3 封装svg图标

vue3 封装svg图标

时间:2024-07-17 12:55:17浏览次数:13  
标签:const name icons svg vue3 import public 图标

安装插件

npm i vite-plugin-svg-icons

1. 修改 vite.config.js

import {resolve} from 'path'
import {createSvgIconsPlugin} from 'vite-plugin-svg-icons';

export default defineConfig({
    plugins: [
        vue(),
        createSvgIconsPlugin({
            iconDirs: [resolve(process.cwd(), 'public')], // svg 文件存放位置
            symbolId: 'icon-[name]', // 指定symbolId格式
        }),
    ],
})

注意:我的 svg 存放路径是根目录下的 ./public,多数情况下放在 ./src/assets

2.修改 main.js,增加一行代码。

import 'virtual:svg-icons-register'

3.使用示例

   

 <svg aria-hidden="true" style="width: 14px; height: 14px">
        <use :href="`#icon-${menu.icon}`" />
    </svg>


 

二、封装 SVG

在 ./src/components 下创建 Icon.vue

<script setup>
const props = defineProps({
    prefix: {type: String, default: 'icon'},
    name: {type: String, required: true},
    color: {type: String},
    size: {type: String, default: '1em'}
});

const symbolId = computed(() => `#${props.prefix}-${props.name}`);
</script>

<template>
    <svg aria-hidden="true" class="svg-icon" :style="'vertical-align:middle;width:' + size + ';height:' + size">
        <use :href="symbolId" :fill="color"/>
    </svg>
</template>

<style scoped>
.svg-icon {
    overflow: hidden;
    fill: currentColor;
}
</style>


svg 样式里添加了 vertical-align:middle

 2.使用示例

<Icon :name="vite"></Icon>


 

三、封装图标选择器

1.在 ./src/components 下创建 IconSelect.vue

<script setup>
import Icon from "@/components/Icon.vue";

const props = defineProps({
    modelValue: {type: String, default: ''},
});

const value = ref(props.modelValue)
const icons = [];
const modules = import.meta.glob('../../public/**/*.svg');
for (const path in modules) {
    const name = path.split('public/')[1].split('.svg')[0];
    icons.push(name);
}

const emits = defineEmits(['update:modelValue']);
const change = (name) => {
    emits('update:modelValue', name)
}
</script>

<template>
    <el-select v-model="value" @change="change" filterable clearable placeholder="Select Icon">
        <el-option v-for="item in icons" :key="item" :label="item" :value="item">
            <span style="float: left">
                <Icon :name="item" size="30px"></Icon>
            </span>
            <span style="float: right;color: var(--el-text-color-secondary);font-size: 13px;">
                {{ item }}
            </span>
        </el-option>
    </el-select>
    <Icon :name="value" size="32px" style="padding-left: 10px"></Icon>
</template>

import.meta.glob('../../public/**/*.svg') 用于获取 ./public 路径下各个层级的 .svg 文件。

2.使用示例(在表单中使用):

<el-form-item label="Icon">
    <IconSelect v-model="obj.icon"></IconSelect>
</el-form-item>

标签:const,name,icons,svg,vue3,import,public,图标
From: https://blog.csdn.net/2301_81274510/article/details/140448133

相关文章

  • Vue3 - 微信公众号H5网站使用微信扫一扫(微信扫码),苹果报错 {“errMsg“:“scanQRCode
    前言关于此问题网上的教程都无法解决,如果您的报错信息与我相似,即可解决。在vue3|nuxt3微信公众号网页开发中,微信移动端h5网页使用JS-SDK中的“微信扫码(微信扫一扫)”wx.scanQRCode接口,苹果ios系统真机测试时出现报错:“errMsg”:“scanQRCode:thepermissi......
  • Mac新手教程:程序坞里的启动台图标消失了如何解决?
    启动台是Mac系统里放应用程序的地方,用户可以通过启动台打开软件列表。一般为了方便使用会把它放在程序坞,但一些用户程序坞里的启动台的图标不见了,如何找回呢?1、打开Mac上的访达应用程序,2、点击访达窗口左边的“应用程序”,3、在应用程序里,找到启动台,4、将启动台图标拖动到程序坞,......
  • vue3,生产环境,禁止调试输出(重写console的方式)
    如果你想在生产环境中直接重写console的方法以禁止其输出,你可以在你的主入口文件(通常是main.js或main.ts)中添加一些代码来实现这一点。但是,请注意,直接修改全局对象(如console)可能不是最佳实践,因为它可能会与其他库或框架产生冲突。然而,如果你确实想这样做,下面是一个简单的例子,说明......
  • vue3 | 通信组件之provide 与 inject实现兄弟组件通信
    一、vue3|通信组件之provide与inject实现兄弟组件通信 通过共同祖先组件使用provide与inject来提供和注入状态,从而实现兄弟组件通信的示例。例子:祖先组件提供了一个名为 sharedState 的响应式状态,并通过 provide 函数将其提供给所有子组件。ChildA 和 ChildB ......
  • vue 使用svg文件图片或者组件方式
    代码<template><!--svg使用--><divclass="box"><div><!--设置stylefill:ref方式可以直接修改svg颜色样式--><svgstyle="fill:red"xmlns="http://www.w3.org/2000/svg"......
  • vue3+TS从0到1手撸后台管理系统
    1.路由配置1.1路由组件的雏形src\views\home\index.vue(以home组件为例)1.2路由配置1.2.1路由index文件src\router\index.ts//通过vue-router插件实现模板路由配置import{createRouter,createWebHashHistory}from'vue-router'import{constantRoute}from'./route......
  • vue3 widthDefaults 设置props默认值
    测试代码<template><divclass="box"><div><i-ep-edit/></div><div><i-ep-chat-dot-round/></div><div><i-ep-close/></div></div></template><scriptl......
  • Vue3项目配置Vue-Router
            在使用 Vue 作为前端开发框架时,我们通常以单页面应用(SPA)的形式进行开发。而单页面应用中,我们通常通过路由跳转的方式来实现我们页面上组件之间的跳转。在本文中,博主将详细介绍在Vue3 项目中,如何进行Vue-Router的安装与配置。在开始安装和配置Vue-Ro......
  • 关于任务栏图标变白的原因及解决方法(以 QQ 为例)
    如下图所示,qq图标变白了,原因是我qq更新后改动了所在位置,或者你将一些软件连同整个文件夹一起移动到其他文件夹下也可能会出现这种情况。这种变白并不是我之前说的桌面图标变白,如果你是桌面的图标变白,可以参考我之前写的博客的解决方案:针对Win10系统为了加速图标的显示,......
  • Vue3新特性defineOptions和defineModel 面试总结
    在Vue3中,defineOptions和defineModel是两个重要的新特性,它们分别在组件定义和v-model双向绑定方面提供了更为便捷和高效的解决方案。defineOptions定义与用途:defineOptions是Vue3.3+版本中引入的一个宏(macro),用于在<scriptsetup>语法糖中定义组件的选项,如组件名(name)、透传属......