SVG图片选择库组件封装及使用

需求

需求: 在项目中通常需要做菜单管理,想要让左侧菜单好看一点,一般都会选择添加图标,需要自定义选择喜欢的图标,得提供一个有选择项的图标库

延伸需求:在项目中通常可能有好几个图标选择库,可能每个可选择图标库里的图标都不能相同,这就需要我们做区分展示

前置条件

需要使用到svg图片,以前有写下载使用svg图片的文章,可以参考一下
链接:在vue中使用svg

图例

1. 菜单图标库

在这里插入图片描述
在这里插入图片描述

2. 场景图标库

在这里插入图片描述
在这里插入图片描述

实现

svg文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以在svg文件夹的下级创建scene文件夹,在svg文件夹中的svg图片属于菜单图标库(不包含scene文件夹中的图片),scene文件夹中的svg图片属于场景图标库,如果想美观一点可以把菜单图标库的图标用文件夹归纳一下,重要的是icons文件夹下的index.js文件中的匹配

index.js文件

import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg componentVue.component('svg-icon', SvgIcon)const req = require.context('./svg', false, /\.svg$/)
//温馨提示:要想使用scene文件夹中的图片一定要写这个哦
const scenereq = require.context('./svg/scene', false, /\.svg$/) 
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
requireAll(scenereq)

1. 菜单图标组件

组件(@/components/IconSelect)
  1. index.vue文件
<template><div class="icon-body"><el-input v-model="name" style="position: relative;" clearable placeholder="请输入图标名称" @clear="filterIcons" @input.native="filterIcons"><i slot="suffix" class="el-icon-search el-input__icon" /></el-input><div class="icon-list"><div v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)"><svg-icon :icon-class="item" style="height: 30px;width: 16px;" /><span>{{ item }}</span></div></div></div>
</template>
<script>
import icons from './requireIcons'
export default {name: 'IconSelect',data() {return {name: '',iconList:icons}},mounted(){},methods: {filterIcons() {this.iconList = iconsif (this.name) {this.iconList = this.iconList.filter(item => item.includes(this.name))}},selectedIcon(name) {this.$emit('selected', name)document.body.click()},reset() {this.name = ''this.iconList = icons}}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>.icon-body {width: 100%;padding: 10px;.icon-list {height: 200px;overflow-y: scroll;div {height: 30px;line-height: 30px;margin-bottom: -5px;cursor: pointer;width: 33%;float: left;}span {display: inline-block;vertical-align: -0.15em;fill: currentColor;overflow: hidden;}}}
</style>
  1. requireIcons.js
const req = require.context('../../icons/svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys()const re = /\.\/(.*)\.svg/const icons = requireAll(req).map(i => {return i.match(re)[1]
})export default icons
使用
<el-form-item label="菜单图标"><el-popover placement="bottom-start" width="460" trigger="click" @show="$refs['IconSelect'].reset()"><IconSelect ref="IconSelect" @selected="selected"/><el-input slot="reference" v-model="form.icon" placeholder="点击选择图标"><svg-icon v-if="form.icon" slot="prefix" :icon-class="form.icon" class="el-input__icon" style="height: 32px;width: 16px;"/><i v-else slot="prefix" class="el-icon-search el-input__icon" /></el-input></el-popover>
</el-form-item>
<script>
import IconSelect from '@/components/IconSelect'
export default {components: { IconSelect},data(){return{form:{icon:undefined}}},methods:{// 选择图标selected(name) {this.form.icon = name},}
}
</script>

2. 场景图标组件

组件(@/components/SceneIconSelect)
  1. index.vue文件
<template><el-popover placement="bottom-start" width="368" trigger="click" popper-class="sence-icon-popover" @show="reset"><div class="icon-body"><div class="icon-list"><div v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)"><svg-icon :icon-class="item" :class="selectIcon===item?'active-svg':'svg'" /></div></div></div><div slot="reference" class="sence-icon"><svg-icon slot="prefix" :icon-class="selectIcon" class="el-input__icon" style="height:24px;width:24px;fill:#606266;"/></div></el-popover>
</template>
<script>
import icons from './requireIcons'
export default {name: 'SceneIcon',props:{selectIcon:String},data(){return{name: '',iconList:icons}},methods:{filterIcons() {this.iconList = iconsif (this.name) {this.iconList = this.iconList.filter(item => item.includes(this.name))}},selectedIcon(name) {this.$emit('selected', name)document.body.click()},reset() {this.name = ''this.iconList = icons}}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.icon-body {width: 100%;.icon-list {height: 128px;overflow-y: auto;padding: 13px;div {height: 24px;line-height: 24px;margin: 5px;cursor: pointer;width: 24px;float: left;display: flex;align-items: center;justify-content: center;.svg{width: 24px;height: 24px;}.active-svg{width: 24px;height: 24px;fill: $--color-mian !important;}&:hover,&:active,&:focus{.svg{fill: $--color-mian !important;}}}}
}
.sence-icon{width: 32px;height: 32px;display: flex;align-items: center;justify-content: center;border: 1px solid #DCDFE6;
}
</style>
<style lang="scss">
.sence-icon-popover{padding: 0 !important;border-radius: 0;border: 1px solid #DCDFE6;.popper__arrow{border-bottom-color: #DCDFE6 !important;}
}
</style>
  1. requireIcons.js
const req = require.context('../../icons/svg/scene', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys()const re = /\.\/(.*)\.svg/const icons = requireAll(req).map(i => {return i.match(re)[1]
})export default icons
使用
<el-form-item label="场景图标" prop="icon"><SceneIconSelect ref="SceneIconSelect" v-model="form.icon" @selected="selected" :selectIcon="form.icon"></SceneIconSelect>
</el-form-item>
<el-form-item label="图标背景色" prop="color" class="picker-color"><el-color-picker v-model="form.color" :class="form.color?'color-picker':'none-color-picker'"></el-color-picker>
</el-form-item>
<script>
import SceneIconSelect from '@/components/SceneIconSelect'
export default {components: { SceneIconSelect},data(){return{form:{icon:'检修', //默认图标color:'#0095FF' //默认颜色}}},methods:{// 选择图标selected(name) {this.form.icon = name},}
}
</script>
<style lang="scss" scped>
.picker-color{::v-deep .el-form-item__content{height: 32px;}.color-picker{::v-deep .el-color-picker__trigger{padding: 0;border: 0;border-radius: 0;.el-color-picker__color{border: 0;border-radius: 0;}}}.none-color-picker{::v-deep .el-color-picker__trigger{padding: 0;border: 0;border-radius: 0;.el-color-picker__color{border: 1px solid #DCDFE6;border-radius: 0;}}}
}
</style>

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

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

相关文章

CentOS 系列:CentOS 7文件系统的组成

CentOS 7文件系统的组成 文件系统的组成Linux的一些重要目录文件和目录名主机名文件权限绝对路径和相对路径绝对路径相对路径 文件系统的组成 一切从根开始 文件路径中只有第一个/是根目录&#xff0c;后面的/是分隔符 文件名区分大小写 除斜线(/)以外&#xff0c;其他的字符…

ruoyi-plus使用Statistic统计组件升级element-plus

原本使用的就是gitee上lionli的ruoyi-plus版本的代码。但是在使用过程中作首页数据看板时想使用elementui的Statistic统计组件。结果在浏览器控制台报错找不到组件el-statistic 于是查看elementui的历史版本&#xff0c;发现是在新版中才有这个组件&#xff0c;旧版本是没这个组…

高防CDN可以起到什么作用?

高防CDN相对于普通的CDN加速&#xff0c;除了具备基础的加速功效外&#xff0c;高防CDN在每一节点上均有相应配置的防御功效&#xff0c;不仅具备了隐藏源站不被攻击的优势&#xff0c;也具备了访问加速&#xff0c;多节点防御的功效。随着互联网的不断发展&#xff0c;网络上的…

【运维】hive 高可用详解: Hive MetaStore HA、hive server HA原理详解;hive高可用实现

文章目录 一. hive高可用原理说明1. Hive MetaStore HA2. hive server HA 二. hive高可用实现1. 配置2. beeline链接测试3. zookeeper相关操作 一. hive高可用原理说明 1. Hive MetaStore HA Hive元数据存储在MetaStore中&#xff0c;包括表的定义、分区、表的属性等信息。 hi…

前端面试灵魂提问

1.自我介绍 2.在实习中&#xff0c;你负责那一模块 3.any与unknow的异同 相同点&#xff1a;any和unkonwn 可以接受任何值 不同点&#xff1a;any会丢掉类型限制&#xff0c;可以用any 类型的变量随意做任何事情。unknown 变量会强制执行类型检查&#xff0c;所以在使用一个…

工具及方法 - 如何阅读epub文件:使用Adobe Digital Editions

EPUB&#xff08;Electronic Publication的缩写&#xff0c;电子出版&#xff09;是一种电子图书标准&#xff0c;由国际数字出版论坛&#xff08;IDPF&#xff09;提出&#xff1b;其中包括3种文件格式标准&#xff08;文件的扩展名为.epub&#xff09;&#xff0c;这个格式已…

【模电】晶闸管

晶闸管 结构和等效模型工作原理晶闸管的伏安特性晶闸管的主要参数额定正向平均电流 I F I\tiny F IF维持电流 I H I\tiny H IH触发电压 U G U\tiny G UG和触发电流 I G I\tiny G IG正向重复峰值电压 U D R M U\tiny DRM UDRM反向重复峰值电压 U R R M U\tiny RRM URRM 晶体闸流…

【LeetCode刷题-链表】--86.分隔链表

86.分隔链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class…

建筑木模板厂家批发

在建筑施工中&#xff0c;木模板是一种常见且重要的施工材料&#xff0c;用于搭建混凝土浇筑的支撑结构。选择合适的建筑木模板厂家进行批发&#xff0c;对于施工质量和效率至关重要。本文将介绍建筑木模板厂家批发的重要性&#xff0c;并推荐贵港市能强优品木业作为专业的建筑…

MVVM 模式与 MVC 模式:构建高效应用的选择

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【SQL SERVER】定时任务

oracle是定时JOB&#xff0c;sqlserver是创建作业&#xff0c;通过sqlserver代理实现 先看SQL SERVER代理得服务有没有开 选择计算机右键——>管理——>服务与应用程序——>服务——>SQL server 代理 然后把SQL server 代理&#xff08;MSSQLSERVER&#xff09;启…

开源vs闭源,大模型的未来在哪一边?

开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。开源让技术共享&#xff0c;吸引了众多人才加入&#xff0c;推动了大模的创新。而闭源则保护了商业利益和技术优势&#xff0c;为大模型的商业应用提供了更好的保障。 那么&#xff0c…

Vue3+java开发组队功能

Vue3java开发系统组队功能 需求分析 创建用户可以创建一个队伍&#xff08;一个房间队长&#xff09;&#xff0c;设置队伍人数&#xff0c;队伍名称&#xff08;标题&#xff09;&#xff0c;描述&#xff0c;超时时间。搜索加入&#xff0c;用户可以加入未满的队伍&#xf…

github新建项目

参考链接&#xff1a;Github上建立新项目超详细方法过程 在这里新建一个repositories 接下来就选择相关的信息&#xff1a; 然后create a new就行了 接下来需要创建文件&#xff1a;&#xff08;同时通过upload上传文件&#xff09; 每次最多上传100个文件&#xff0c;然后保…

OpenGL笔记:纹理的初次使用

说明 纹理的代码写完后&#xff0c;一直出不来结果&#xff0c;原因是没有设置GL_TEXTURE_MIN_FILTER&#xff0c; 它的默认值为GL_NEAREST_MIPMAP_LINEAR&#xff0c; 因为这里我还没用到Mipmap&#xff0c;所以使用这个默认值&#xff0c;结果是错误的&#xff0c;关于mipma…

软著项目推荐 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

正点原子linux应用编程——提高篇1

在之前的入门篇学习中&#xff0c;都是直接在Ubuntu中进行验证的&#xff0c;对于嵌入式Linux系统来说&#xff0c;也是可以直接移植的&#xff0c;只需要使用嵌入式硬件平台对应的交叉编译工具编译应用程序即可运行。 在嵌入式Linux系统中&#xff0c;编写的应用程序通常需要…

Prometheus的详细部署

普罗米修斯下载网址: Download | Prometheus 准备两台机器&#xff1a; 192.168.58.152 prometheus 192.168.58.142 node_exporter 关闭防火墙和selinux&#xff1a; [rootlocalhost ~]# setenforce 0 && systemctl stop firewalld[rootlocalhost ~]# seten…

机器视觉双目测宽仪具体有什么优势?

双目测宽仪是机器视觉原来制造而成的智能宽度检测设备&#xff0c;广泛应用于板材类产品的宽度检测。通过测宽仪的使用&#xff0c;实时了解产品宽度品质&#xff0c;进行超差提示&#xff0c;减少废品的生产。 双目测宽仪优势 测量软件界面显示&#xff1a;产品规格、标称宽…

Android控件全解手册 - 任意View缩放平移工具-源码

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…