当前位置: 首页 > news >正文

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.lryc.cn/news/223002.html

相关文章:

  • NIO讲解
  • react中jest配置,解决node_modules报错esm无法解析的问题
  • Qt6,使用 UI 界面完成命令执行自动化的设计
  • Apache Maven;会话技术
  • Azure - 机器学习:使用自动化机器学习训练计算机视觉模型的数据架构
  • 【C++】stack | queue | priority_queue | deque
  • 华为gre带验证key案例
  • Java算法(三): 判断两个数组是否为相等 → (要求:长度、顺序、元素)相等
  • 基于STM32的设计智慧超市管理系统(带收银系统+物联网环境监测)
  • 深入浅出理解ResNet网络模型+PyTorch实现
  • 【C++】万字一文全解【继承】及其特性__[剖析底层化繁为简](20)
  • 微信小程序之自定义组件开发
  • MCU系统的调试技巧
  • 【机器学习基础】机器学习概述
  • Python Selenium 执行 JavaScript
  • HTML的表单标签和无语义标签的讲解
  • 8.spark自适应查询-AQE之自适应调整Shuffle分区数量
  • 【Java 进阶篇】Java Filter 快速入门
  • Pytorch R-CNN目标检测-汽车car
  • 【PG】PostgreSQL13主从流复制部署(详细可用)
  • 学习pytorch15 优化器
  • [算法日志]图论刷题 沉岛思想的运用
  • Web服务器的搭建
  • 如何使用 GTX750 或 1050 显卡安装 CUDA11+
  • 跟着森老师学React Hooks(1)——使用Vite构建React项目
  • 强力解决使用node版本管理工具 NVM 出现的问题(找不到 node,或者找不到 npm)
  • Docker指定容器使用内存
  • 做什么数据表格啊,要做就做数据可视化
  • CSS特效003:太阳、地球、月球的旋转
  • 云计算的大模型之争,亚马逊云科技落后了?