Vue3:自定义图标选择器(包含 SVG 图标封装)

文章目录

      • 一、准备工作(在 Vue3 中使用 SVG)
      • 二、封装 SVG
      • 三、封装图标选择器
      • 四、Demo

效果预览:
在这里插入图片描述

一、准备工作(在 Vue3 中使用 SVG)

本文参考:https://blog.csdn.net/houtengyang/article/details/129043100

  1. 安装插件

    npm i vite-plugin-svg-icons
    
  2. 配置插件

    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

将上述使用示例封装为组件。

  1. ./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>
    

在这里插入图片描述

四、Demo

<script setup>
import IconSelect from "@/components/IconSelect.vue";
import Icon from "@/components/Icon.vue";const symbol = ref('')
</script><template>{{ symbol }}<Icon :name="symbol" size="32px" style="padding-left: 10px"></Icon><br/><IconSelect v-model="symbol"/>
</template>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tcl语言:SDC约束命令create_generated_clock详解(下)

相关阅读 Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm1001.2014.3001.5482 设定生成时钟特性 前文的末尾提到&#xff0c;当使用-divide by或-multiply_by选项创建生成时钟时&#xff0c;会根据master clock的时钟周期派生出生成时钟的周期&am…

239.滑动窗口的最大值

原题链接&#xff1a;239.滑动窗口的最大值 不是很懂&#xff0c;需要复刷 全代码&#xff1a; class Solution { private:class MyQueue { //单调队列&#xff08;从大到小&#xff09;public:deque<int> que; // 使用deque来实现单调队列// 每次弹出的时候&#xff…

YOLOv5独家改进:分层特征融合策略MSBlock | 南开大学提出YOLO-MS |超越YOLOv8与RTMDet,即插即用打破性能瓶颈

💡💡💡本文独家改进:分层特征融合策略MSBlock,不同Kernel-Size卷积在不同尺度提升特征提取能力,最终引入到YOLOv5,做到二次创新 1)MSBlock使用;2)和C3结合使用 推荐指数:5颗星 MSBlock | 亲测在多个数据集能够实现大幅涨点,小目标检测效果也不错 💡💡…

Docker的安装以及使用

每次安装Docker都会报一堆错&#xff0c;痛定思痛干脆自己总结一篇&#xff01;&#xff01;&#xff01; Docker的安装 卸载系统自带的旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc 获取软件最新源 sudo apt-get update 安装apt依赖包 s…

vue3中el-tree设置默认选中节点和展开节点

1.el-tree设置 node-key&#xff0c;current-node-key&#xff0c;default-expanded-keys&#xff0c;highlight-current&#xff1a; <el-tree ref"taskTree" :data"ptreeData" node-key"key" :current-node-key"currentKey" …

yum工具的使用

yum工具的使用 rpm的弊端 前面我们讲了下rpm&#xff0c;那么rpm有什么弊端呢&#xff1f;其弊端是显而易见的&#xff0c;当用rpm安装软件时&#xff0c;若遇到有依赖关系的软件&#xff0c;必须先安装依赖的软件才能继续安装我们要安装的软件&#xff0c;当依赖关系很复杂的…

[CISCN 2023 初赛]go_session

文章目录 考点代码审计main.goroute.goIndex函数Admin函数Flask函数 解题过程伪造session获取server.py构造payload覆盖server.py命令执行 考点 session伪造&#xff0c;pongo2模板注入&#xff0c;debug模式覆盖源文件 代码审计 main.go package mainimport ("github.c…

正则表达式:掌握文本处理的秘密武器

当我们处理文本数据时&#xff0c;正则表达式是一种强大的工具&#xff0c;可以帮助我们快速、准确地找到所需的信息。通过匹配和筛选文本模式&#xff0c;正则表达式可以简化文本处理任务&#xff0c;提高工作效率。本文将带你走进正则表达式的世界&#xff0c;探讨它的工作原…

汇编-变量

.386 .model flat,stdcall option casemap:none.data sum DWORD 0 ;创建一个全局变量&#xff0c;取名sum,初始化0 sum1 DWORD ? ;创建一个全局变量sum1,无初始化 ;问号(?)初始化值使得变量未被初始化&#xff0c;这意味着在运行时才会为该变量分配一个值 ;变量名…

【Node.js入门】1.3 开始开发Node.js应用程序

1.3 开始开发Node.js应用程序 学习目标 &#xff08;1&#xff09;熟悉开发工具Visual Studio Code的基本使用&#xff1b; &#xff08;2&#xff09;掌握Node.js应用程序的编写、运行和调试的基本方法。 构建第一个 Node.js应用程序 代码 const http require("htt…

【小技巧】WPS统计纯汉字(不计标点符号)

【小技巧】WPS统计纯汉字&#xff08;不计标点符号&#xff09; 首先&#xff0c;CtrlF打开查找页面&#xff1a; 选择“高级搜索”&#xff0c;然后勾选“使用通配符”&#xff0c;然后在“查找内容”后面输入&#xff1a;[一-﨩]。注意&#xff1a;一定要带“[]”和“-”且…

算法leetcode|87. 扰乱字符串(rust重拳出击)

文章目录 87. 扰乱字符串&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 87. 扰乱字符串&#xff1a; 使用下面描述…

web前端——HTML+CSS实现九宫格

web前端——HTMLCSS实现九宫格 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

C 和 C++ 可变参数介绍

文章目录 前言概念C 的可变参数参数列表 #va_list 4组宏 C 的可变参数参数列表 #va_list 4组宏初始化列表 initializer_list<> 类模板可变参数模板 总结参考资料作者的话 前言 C 和 C 可变参数介绍。 概念 可变&#xff08;长&#xff09;/不定&#xff08;长&#xff…

10道高频Vuex面试题快问快答

※其他的快问快答&#xff0c;看这里&#xff01; 10道高频Qiankun微前端面试题快问快答 10道高频webpack面试题快问快答 20道高频CSS面试题快问快答 20道高频JavaScript面试题快问快答 30道高频Vue面试题快问快答 面试中的快问快答 快问快答的情景在面试中非常常见。 在面试过…

NOIP2023模拟14联测35 charlotte

题目大意 给你一棵有 n n n个节点的树&#xff0c;并用 01 01 01串告诉你哪些节点上有棋子&#xff08;恰好一棵&#xff09;。 你可以进行若干次操作&#xff0c;每次操作可以将两颗距离至少为 2 2 2的棋子向彼此移动一步。 问能否通过若干次操作使得所有的棋子都在一个点上…

07 # 手写 find 方法

find 的使用 find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。 ele&#xff1a;表示数组中的每一个元素index&#xff1a;表示数据中元素的索引array&#xff1a;表示数组 <script>var arr [1, 3, 5, 7, 9];var result arr.find(fun…

【Edge】微软Edge每次启动自动导入Chrome收藏夹,无法取消“每次启动浏览器时导入浏览数据”功能的解决方法(202311)

写在前面 Edge现在也不管用户体验了吗? 这个BUG都快一个月了&#xff0c;还没见修复&#xff0c;从118.0.2088开始&#xff0c;我是在2023年10月份一次更新后发现的这个BUG&#xff0c;结果社区论坛什么信息都没有&#xff0c;英文也没收到。 Edge的BUG现象 不知道哪次Edge…

Chatgpt人工智能对话源码系统分享 带完整搭建教程

ChatGPT的开发基于大规模预训练模型技术。预训练模型是一种在大量文本数据上进行训练的模型&#xff0c;可以学习到各种语言模式和知识。在ChatGPT中&#xff0c;预训练模型被用于学习如何生成文本&#xff0c;并且可以用于各种不同的任务&#xff0c;如对话生成、问答、摘要等…

SpringBoot整合Kafka (二)

&#x1f4d1;前言 本文主要讲了SpringBoot整合Kafka文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ 上文链接&#xff1a;SpringBoot整合Kafka (一) &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页…