vue3+ts封装图标选择组件

news2024/11/25 14:20:59

概要

讲解在vue3的项目中封装一个简单好用的图标选择组件。

效果

在这里插入图片描述

第一步,准备图标数据

数据太多,大家去项目中看。项目地址https://gitee.com/nideweixiaonuannuande/xt-admin-vue3
在这里插入图片描述

第二步,页面与样式编写

<template>
  <div>
    <el-icon
      class="icon-picker"
      :class="{ empty: myValue === '' }"
      @click="dialogVisible = true"
    >
      <svg-icon :name="myValue !== '' ? myValue : 'ep:plus'" />
    </el-icon>

    <xt-dialog v-model="dialogVisible" width="800px" title="选择图标" :show-cancel="false" :show-confirm="false">
      <div>
        <el-tabs v-model="activeName" tab-position="left">
          <el-tab-pane
            v-for="item in data"
            :key="item.prefix"
            :label="item.name"
            :name="item.prefix"
          >
            <div class="flex flex-wrap">
              <div
                class="border cursor-pointer border-red-300 p-4"
                title="删除已选图标"
                @click="removeIcon"
              >
                <el-icon :size="24">
                  <svg-icon name="ep:delete" />
                </el-icon>
              </div>
              <div
                v-for="icon in currentIconList"
                :key="icon"
                class="border cursor-pointer p-4"
                @click="chooseIcon(`${activeName}:${icon}`)"
              >
                <el-icon :size="24">
                  <svg-icon :name="`${activeName}:${icon}`" />
                </el-icon>
              </div>
            </div>
          </el-tab-pane>
        </el-tabs>
        <div class="flex mt-4 px-10 justify-end">
          <el-pagination
            v-model:current-page="pagination.page"
            layout="prev, pager, next"
            :page-size="pagination.pageSize"
            :total="iconList.length"
            :pager-count="5"
            background
          />
        </div>
      </div>
    </xt-dialog>
  </div>
</template>

<style lang="scss" scoped>
.icon-picker {
  width: 40px;
  height: 40px;
  line-height: 36px;
  text-align: center;
  color: var(--el-text-color-regular);
  border: 1px solid var(--el-border-color);
  border-radius: 5px;
  cursor: pointer;
  transition: 0.3s;
  font-size: 24px;
  vertical-align: middle;

  &:hover {
    border: 1px solid var(--el-border-color-darker);
  }

  &.empty {
    color: var(--el-text-color-placeholder);
    border: 1px dashed var(--el-border-color);

    &:hover {
      color: var(--el-text-color-regular);
      border: 1px solid var(--el-border-color-darker);
    }
  }
}
</style>

第三步,逻辑编写

<script setup lang="ts">
import data from './data/data.json'

defineOptions({
  name: 'IconPicker',
})

const props = withDefaults(defineProps<{
  modelValue: string
}>(), {})

const emits = defineEmits(['update:modelValue'])

const myValue = computed({
  get() {
    return props.modelValue
  },

  set(value) {
    emits('update:modelValue', value)
  },
})

// ------------------数据初始化------------------
const activeName = ref(myValue.value.split(':')[0] || data[0].prefix)

const pagination = ref({
  page: 1,
  pageSize: 49,
})
const iconList = computed(() => {
  return data.filter(item => item.prefix === activeName.value)[0].icons
})

const currentIconList = computed(() => {
  return iconList.value.slice(
    (pagination.value.page - 1) * pagination.value.pageSize,
    (pagination.value.page - 1) * pagination.value.pageSize
      + pagination.value.pageSize,
  )
})

// ------------------选择图标相关------------------
const dialogVisible = ref(false)

function chooseIcon(val: string) {
  myValue.value = val
  dialogVisible.value = false
}

function removeIcon() {
  myValue.value = ''
  dialogVisible.value = false
}
</script>

写在最后

这个组件中涉及到的svg-icon和xt-dialog组件大家可前往https://gitee.com/nideweixiaonuannuande/xt-admin-vue3中查看源代码

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

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

相关文章

【蓝桥杯选拔赛真题48】python最小矩阵 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python最小矩阵 一、题目要求 1、编程实现 2、输入输出 二、算法分析

电压放大器可用于什么场合

电压放大器是电子器件中常见的一种放大器类型&#xff0c;它可以将输入信号的电压放大到更大的幅度&#xff0c;以满足特定应用的需求。电压放大器广泛应用于多个领域和场合&#xff0c;下面将详细介绍一些使用电压放大器的场景。 音频放大器&#xff1a;音频放大器是电压放大器…

Python 包管理器入门指南

什么是 PIP&#xff1f; PIP 是 Python 包管理器&#xff0c;用于管理 Python 包或模块。注意&#xff1a;如果您的 Python 版本是 3.4 或更高&#xff0c;PIP 已经默认安装了。 什么是包&#xff1f; 一个包包含了一个模块所需的所有文件。模块是您可以包含在项目中的 Pyth…

第四章 串【数据结构与算法】【精致版】

第四章 串【数据结构与算法】【精致版】 前言版权第4章串4.1应用实例4.2串及其运算4.2.1串的基本概念4.2.2 串的基本运算**4-1串的删除操作.c** 4.3串的存储结构及实现4.3.1 定长顺序串**1-定长顺序串.c** 4.3.2 堆串**2-堆串.c** 4.3.3 块链串**3-块链串.c** 4.4串的模式匹配4…

A股市场全景分析系列—“连板打分模型”跟踪图谱已出炉!

前言‍‍ 我们的股票量化系统QTYX内置了“涨停板打分模型”&#xff0c;对每日涨停个股的“连板天数”、“封板时间”、“炸板次数”、“封成比”这四个方面进行综合评分&#xff0c;大于24分以上的个股涨停力度较强&#xff0c;可以评估次日连板的可能。‍‍‍‍‍ 股票量化分…

全国产信创实景三维全流程产品体系亮相首届中国测绘地理信息大会

2023年11月8日至10日&#xff0c;以“科技引领&#xff0c;创新驱动&#xff0c;北斗赋能&#xff0c;产业强国”为主题&#xff0c;由自然资源部指导&#xff0c;中国测绘学会、中国地理信息产业协会和中国卫星导航定位协会共同主办的第一届中国测绘地理信息大会将在浙江德清国…

【算法|二分查找No.1】leetcode 704. 二分查找+二分模板 leetcode 34. 在排序数组中查找元素的第一个和最后一个位置

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

小白如何制作电子画册?看这里,超多画册模板任你挑!

传统纸质版的画册&#xff0c;制作起来即费力又费时&#xff0c;花费还高&#xff0c;想要修改内容还得重新制作&#xff0c;特别麻烦。现在互联网发达&#xff0c;如今已经用上了H5的技术&#xff0c;小白也能快速制作一本翻页电子画册。 只需用FLBOOK&#xff0c;在线就可以制…

线上Kafka集群如何调整消息存储时间

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 Kafka版本 kafka_2.13-3.5.0 背景 Kafka 默认消息存储时间为7天&#xff0c;实际线上的业务使用Kafka更多的是一些数据统计之类的业务&#xff0c;大多是朝生夕…

Screens for Mac 中文版 远程桌面连接控制工具

Screens Mac 版是Mac os平台上的一款Mac VNC 客户终端,能够自由访问远程计算机设备&#xff0c; Screens Mac 版支持各种强大的远程控制辅助工具&#xff0c;例如剪切板共享、快捷方式自定义、安全连接、多屏幕支持、快速扫描连接等。 Screens 4 for mac支持多种远程桌面协议&…

【Orangepi Zero2 全志H616】资料及环境搭建

点击跳转 点击跳转 点击跳转 点击跳转 点击跳转 点击跳转 跳转到此处 跳转到此处 跳转到此处 跳转到此处 跳转到此处 跳转到此处 官网资料下载 GitHub&#xff1a;新版本的 orangepi-build 源码 环境搭建&#xff1a;新手配置教程 打开 MobaXterm &#xff0c;单击左上的图标…

element-ui属性、事件、方法

在使用组件的方法时需要在对应的组件中加入 ref “组件别名” 在调用方法时直接使用 this.$refs.组件别名.方法名() 注意&#xff1a;在element-UI中所有组件 都存在 属性 事件 和方法 属性&#xff1a;直接写在对应的组件标签上&#xff0c;使用方法 :属性名 属性值 方式 事…

ABAP简单的队列设置QRFC

场景&#xff1a;用job的方式在接口里启用job&#xff0c;如果接口调用比较频繁&#xff0c;存在同一时间启动相同job的情况&#xff0c;会导致锁表锁程序这种情况。 查阅job函数&#xff0c;发现在JOB_CLOSE函数里自带了类似队列的参数&#xff0c;但是因为是接口&#xff0c…

如何控制 LLM 的输出格式和解析其输出结果?

现在很多人对于如何使用像 ChatGPT 这样的 LLM 已经比较有经验了&#xff0c;可以使用各种不同的 Prompt 得到自己想要的结果。但有时候我们的使用场景不局限于手动操作&#xff0c;而是需要结合程序去调用 API&#xff0c;并且解析 API 的返回结果&#xff0c;从而实现一些自动…

如何在 Unbuntu 下安装配置 Apache Zookeeper

简介 Zookeeper 是 apache 基金组织下的项目&#xff0c;项目用于简单的监控和管理一组服务&#xff0c;通过简单的接口就可以集中协调一组服务&#xff0c;如配置管理&#xff0c;信息同步&#xff0c;命名&#xff0c;分布式协调。 准备工作 Ubuntu 23.04 或者 20.04访问…

中国等28个国家发布《布莱切利宣言》,鼓励AI以安全方式发展

英国时间11月1日&#xff0c;中国、美国、英国、法国、德国等28个国家和欧盟&#xff0c;在英国的布莱切利庄园签署了&#xff0c;首个全球性人工智能&#xff08;AI&#xff09;声明——《布莱切利宣言》。 该宣言明确指出了AI对人类社会的巨大机遇&#xff0c;但AI需要以人为…

核心舱在轨飞行VR沉浸式互动体验满足大家宇宙探险的心愿

近日神州十七号载人飞船迎来发射&#xff0c;随着我国载人航天工程进入空间站应用与发展阶段&#xff0c;在轨航天探索和运维工作进入常态化阶段&#xff0c;然而每次出征都牵动着亿万人民的心&#xff0c;对航天航空的好奇和向往也越来越强烈。为了让普通人也能体验乘坐飞船上…

腾讯云轻量应用服务器2核4G5M三年566.6元还有吗?

腾讯云双11优惠活动3年轻量2核4G5M服务器从566.6元涨价到756元三年&#xff0c;3年轻量2核2G4M服务器从366.6元恢复到540元三年&#xff0c;大家抓紧吧&#xff0c;三年轻量已经库存已经不多了&#xff0c;看看隔壁阿里云&#xff0c;都是一年期的&#xff0c;活动&#xff1a;…

Compress JPEG PNG images-WordPress图片压缩插件使用方法

插件介绍 Compress JPEG & PNG images是一款非常好用的图片压缩插件:&#xff0c;非常值得大家安装使用&#xff1b;特别是图片类型网站。其实我们很多服务器磁盘空间是不在乎多那么几十MB大小的&#xff0c;但是压缩了图片能提升网站速度&#xff0c;节省宽带&#xff0c…

【Kubernetes部署】Kurbernetes集群高可用架构(二进制部署多Master节点)

高可用 一、基本架构1.1 为什么要有多个Master节点&#xff1f;1.1.1 Master节点单点故障问题1.1.2 选举算法的要求 1.2 基本架构 二、新Master节点的部署2.1 系统初始化操作Step1 关闭防火墙、selinux和swap分区Step2 修改主机名&#xff0c;添加域名映射Step3 修改内核参数St…