Vue将Element Plus 进行自定义封装

一、前言

Element Plus 是一套基于 Vue 3.0 的桌面端组件库,它可以很方便地实现各种样式的组件,就连图标选择器这样的小功能也不在话下。不过今天我们要做的是——封装 Element Plus 的图标选择器。

二、安装

安装 Element Plus:

npm i element-plus -S

三、预览

先看一下我们要实现的效果:

https://cdn.jsdelivr.net/gh/xugaoyi/image_store/blog/20210823232623.gif

四、封装

首先我们需要在 `main.js` 中引入 `Element Plus`:

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'createApp(App).use(ElementPlus).mount('#app')

然后我们要封装一个图标选择器组件,这里我们命名为 `IconPicker`,并将其注册为全局组件:

import { Upload, Dialog, RadioGroup, RadioButton, Input, Button } from 'element-plus'
import { computed, defineComponent, ref, watch } from 'vue'export default defineComponent({name: 'IconPicker',components: {ElUpload: Upload,ElDialog: Dialog,ElRadioGroup: RadioGroup,ElRadioButton: RadioButton,ElInput: Input,ElButton: Button},props: {value: {type: String,required: true},prefixIcon: {type: String,default: 'el-icon-more'}},emits: ['update:value'],setup(props, { emit }) {const showIconPicker = ref(false) // 是否显示图标选择器const searchText = ref('') // 搜索文本框的值const searchResults = ref([]) // 搜索结果// 所有图标名称列表const icons = ['el-icon-info','el-icon-warning',// ...'el-icon-close']// 根据搜索文本过滤图标名称const filteredIcons = computed(() => {return icons.filter(icon => icon.includes(searchText.value))})// 根据搜索文本过滤图标分类const iconCategories = computed(() => {const categories = []for (let i = 0; i < filteredIcons.value.length; i++) {const icon = filteredIcons.value[i]const category = icon.split('-')[0]if (!categories.includes(category)) {categories.push(category)}}return categories})// 根据当前搜索结果生成分类列表const categoryList = computed(() => {const list = []for (let i = 0; i < iconCategories.value.length; i++) {const category = iconCategories.value[i]const icons = filteredIcons.value.filter(icon => icon.split('-')[0] === category)list.push({name: category,icons})}return list})// 当搜索文本发生变化时重新过滤图标watch(searchText, () => {searchResults.value = filteredIcons.value})// 打开图标选择器const openIconPicker = () => {showIconPicker.value = true}// 关闭图标选择器const closeIconPicker = () => {showIconPicker.value = false}// 选择一个图标const selectIcon = (icon) => {emit('update:value', icon)closeIconPicker()}return {showIconPicker,searchText,searchResults,categoryList,openIconPicker,closeIconPicker,selectIcon}}
})

五、使用

在需要使用图标选择器的地方,我们只需要通过 `v-model` 绑定一个变量即可:

<template><div><el-input v-model="icon" readonly /><el-button type="primary" @click="openIconPicker">选择图标</el-button><icon-picker v-model="icon" /></div>
</template><script>
import IconPicker from './components/IconPicker.vue'
import { defineComponent, ref } from 'vue'export default defineComponent({name: 'App',components: {IconPicker},setup() {const icon = ref('el-icon-info')return {icon}}
})
</script>

最后我们只需要在 `main.js` 中引入我们封装的 `IconPicker` 组件:

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
import IconPicker from './components/IconPicker.vue'const app = createApp(App)app.use(ElementPlus)
app.component('IconPicker', IconPicker)app.mount('#app')

六、总结

至此,我们已经完成了一个图标选择器的封装工作。封装这个小组件的意义不在于实现这个功能,更在于让我们了解如何封装一个 Vue 组件。在开发中,不管是做大型应用还是小型应用,都离不开组件的使用和封装,应该都能收到很好的效果。

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

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

相关文章

从0到1之微信小程序快速入门(03)

目录 什么是生命周期函数 WXS脚本 ​编辑 与 JavaScript 不同 纯数据字段 组件生命周期 定义生命周期方法 代码示例 组件所在页面的生命周期 代码示例 插槽 什么是插槽 启用多插槽 ​编辑 定义多插槽 组件通信 组件间通信 监听事件 触发事件 获取组件实例 自…

推荐免费的文本转语音工具TTS-Vue【且开源】

标签&#xff1a; 文本转语音&#xff1b; 免费文本转语音软件&#xff1b; 网上有很多文本转语音的工具&#xff0c;但收费具多。 这里推荐一个免费的文本转语音工具。 不需要注册&#xff0c;下载安装就可以使用。且代码开源。 TTS-Vue 软件主页&#xff1a;https://loker…

第06章_多表查询

第06章_多表查询 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之…

<蓝桥杯软件赛>零基础备赛20周--第3周--填空题

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

MySQL(1):开始

概述 DB&#xff1a;数据库&#xff08;Database&#xff09; 即存储数据的“仓库”&#xff0c;其本质是一个文件系统。它保存了一系列有组织的数据。 DBMS&#xff1a;数据库管理系统&#xff08;Database Management System&#xff09; 是一种操纵和管理数据库的大型软件…

mac 安装homebrew ,golang

mac 安装homebrew ,golang 安装homebrew安装golang选择 apple arm 版本安装配置环境变量 安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"回车执行指令后&#xff0c;根据提示操作。具体包括以下提示操作&am…

腾讯云轻量服务器“镜像类型”以及“镜像”选择方法

腾讯云轻量应用服务器镜像类型分为应用镜像、系统镜像、Docker基础镜像、自定义镜像和共享镜像&#xff0c;腾讯云百科txybk.com来详细说下不同镜像类型说明和详细介绍&#xff1a; 轻量应用服务器镜像类型说明 腾讯云轻量应用服务器 应用镜像&#xff1a;独有的应用镜像除了包…

API安全之《大话:API的前世今生》

写在前面&#xff1a;本文结合API使用的业界现状&#xff0c;系统性地阐述API的基本概念、发展历史、表现形式等基础内容&#xff0c;主要包含以下内容&#xff1a; 1.什么是API 2.API的发展历史 3.现代API常用消息格式 4.top N 互联网企业API 使用现状 当前的世界是一个信…

九州未来入选“2023边缘计算产业图谱”三大细分领域

10月26日&#xff0c;边缘计算社区正式发布《2023边缘计算产业图谱》&#xff0c;九州未来凭借深厚的技术积累、优秀的产品服务、完善的产品解决方案体系以及开源贡献&#xff0c;实力入选图谱——边缘计算平台、边缘计算开源、边缘云服务提供商三大细分领域&#xff0c;充分彰…

uniapp保存网络图片

先执行下载uni.downloadFile接口&#xff0c;再执行保存图片uni.saveImageToPhotosAlbum接口。 // 保存二维码 saveQrcode() {var _this this;uni.downloadFile({url: _this.qrcodeUrl, //二维码网络图片的地址success(res) {console.log(res);uni.saveImageToPhotosAlbum({fi…

python中使用websocket调用、获取、保存大模型API

笔者最近在测试星火大模型的时候&#xff0c;他们是使用websocket 来建立对话&#xff0c;而且星火大模型开放的测试代码&#xff0c;质量上不咋地&#xff08;20231030记录&#xff09;&#xff0c;还需要对websocket有一定的了解&#xff0c;才适合自己微调。 安装&#xff…

explain查询sql执行计划返回的字段的详细说明

当使用EXPLAIN命令查看SQL语句的执行计划时&#xff0c;会返回一张表格&#xff0c;其中包含了该SQL语句的执行计划。下面是每个字段的详细分析&#xff1a; id&#xff1a;执行计划的唯一标识符。如果查询中有子查询&#xff0c;每个子查询都会有一个唯一的ID。在执行计划中&a…

JavaScript的分支结构,循环结构,以及函数的定义使用,数组

JS分支结构 if语句 同java if if…else if…else…if //案例&#xff1a;判断输入密码长度 let pwd prompt("请输入密码");let L pwd.length;if(L<6){alert("密码小于六位");}else if(L>6 && L<16){alert("密码大于6位小于1…

聊聊统一认证中的四种安全认证协议(干货分享)

大家好&#xff0c;我是陈哈哈。单点登录SSO的出现是为了解决众多企业面临的痛点&#xff0c;场景即用户需要登录N个程序或系统&#xff0c;每个程序与系统都有不同的用户名和密码。在企业发展初期&#xff0c;可能仅仅有几个程序时&#xff0c;管理账户和密码不是一件难事。但…

一文彻底理解python浅拷贝和深拷贝

目录 一、必备知识二、基本概念三、列表&#xff0c;元组&#xff0c;集合&#xff0c;字符串&#xff0c;字典浅拷贝3.1 列表3.2 元组3.3 集合3.4 字符串3.5 字典3.6 特别注意可视化展示浅拷贝总结 四、列表&#xff0c;元组&#xff0c;集合&#xff0c;字符串&#xff0c;字…

Python爬虫实战(六)——使用代理IP批量下载高清小姐姐图片(附上完整源码)

文章目录 一、爬取目标二、实现效果三、准备工作四、代理IP4.1 代理IP是什么&#xff1f;4.2 代理IP的好处&#xff1f;4.3 获取代理IP4.4 Python获取代理IP 五、代理实战5.1 导入模块5.2 设置翻页5.3 获取图片链接5.4 下载图片5.5 调用主函数5.6 完整源码5.7 免费代理不够用怎…

【UE 模型描边】UE5中给模型描边 数字孪生 智慧城市领域 提供资源下载

目录 0 引言1 Soft Outlines1.1 虚幻商城1.2 使用步骤 2 Auto Mesh Outlines2.1 虚幻商城2.2 使用步骤 3 Survivor Vision3.1 虚幻商城3.2 使用步骤 结尾 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xf…

多线程---JUC

文章目录 什么是JUC&#xff1f;Callable接口ReentrantLockReentrantLock VS synchronized 原子类线程池信号量SemaphoreCountDownLatch 什么是JUC&#xff1f; JUC是&#xff1a;java.util.concurrent这个包名的缩写。它里面包含了与并发相关&#xff0c;即与多线程相关的很多…

【NeurIPS 2023】多模态联合视频生成大模型CoDi

Diffusion Models视频生成-博客汇总 前言:目前视频生成的大部分工作都是只能生成无声音的视频,距离真正可用的视频还有不小的差距。CoDi提出了一种并行多模态生成的大模型,可以同时生成带有音频的视频,距离真正的视频生成更近了一步。相信在不远的将来,可以AI生成的模型可…

C++ 指针

*放在哪里&#xff1f; 如果声明一个变量&#xff1a;int* b; 如果声明多个变量&#xff1a;int a,*b,*c; nullptr c11中NULL的变形&#xff0c;是一个特殊值&#xff0c;可以赋给任意类型的指针&#xff0c;代表该指针指向为空。 this指针 this指针不是一个const Test*(…