vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label)

一、效果图

在这里插入图片描述

二、参数配置

1、代码示例

<t-antd-selectv-model="selectVlaue":optionSource="stepList"@change="selectChange"
/>

2、配置参数(Attributes)继承 a-select Attributes

参数说明类型默认值
v-model绑定值boolean / string / number/Array-
mode设置’multiple’'tags’多选 (显示全选)String-
optionSource下拉数据源Array-
widthselect宽度(可以设置百分比或px)String100%
customLabel是否自定义设置下拉labelString-
valueKey传入的 option 数组中,要作为最终选择项的键值 keyString‘key’
labelKey传入的 option 数组中,要作为显示项的键值名称String‘label’
isShowPagination是否显示分页(分页不显示全选框)Booleanfalse
paginationOption分页配置项Object-

2-1、paginationOption配置参数(Attributes)继承 a-pagination Attributes

参数说明类型默认值
current当前页数number1
pageSize每页显示条目个数number6
total总条目数number0
bind继承a-pagination属性Object-

3、继承 a-select&&a-pagination events

事件名说明返回值
current-change当前页码当前选中的页码

三、源码

<template><div @mousedown="e => {e.preventDefault()selectOpen = true}" ref="main"><a-selectclass="t_select"v-model="childSelectedValue":style="{width: width||'100%'}":placeholder="placeholder":open="selectOpen"@select="handleSelect"v-bind="attrs"v-on="$listeners":mode="mode"><template v-for="(index, name) in $slots" v-slot:[name]><slot :name="name" /></template><template v-for="(index, name) in $scopedSlots" v-slot:[name]="data"><slot :name="name" v-bind="data"></slot></template><div slot="dropdownRender" slot-scope="menu"><a-checkboxv-if="mode&&!isShowPagination":checked="selectChecked"@change="selectAll"class="all_checkbox">全选</a-checkbox><v-nodes :vnodes="menu" /><div class="t_select__pagination" v-if="isShowPagination"><a-pagination:page-size.sync="paginationOption.pageSize"v-model="paginationOption.current":total="paginationOption.total"@change="currentChange"v-bind="{size:'small','hide-on-single-page':true,'showQuickJumper': true,...$attrs,...paginationOption.bind,}"v-on="$listeners"/></div></div><a-select-optionv-for="(item,index) in optionSource":key="index":value="item[valueKey]">{{customLabel?customLabelHandler(item):item[labelKey]}}</a-select-option></a-select></div>
</template>
<script>
export default {name: 'TAntdSelect',components: {VNodes: {functional: true,render: (h, ctx) => ctx.props.vnodes}},props: {value: {type: [String, Number, Array, Boolean, Object]},// 多选 'multiple'mode: {type: String},placeholder: {type: String,default: '请选择'},// 选择框宽度width: {type: String},// 是否自定义设置下拉labelcustomLabel: {type: String},// 传入的option数组中,要作为最终选择项的键值keyvalueKey: {type: String,default: 'key'},// 传入的option数组中,要作为显示项的键值名称labelKey: {type: String,default: 'label'},// 下拉框组件数据源optionSource: {type: Array},// 是否显示分页isShowPagination: {type: Boolean,default: false},// 分页配置项paginationOption: {type: Object,default: () => {return {pageSize: 6, // 每页显示条数current: 1, // 当前页total: 0 // 总条数}}}},data() {return {selectOpen: false}},computed: {childSelectedValue: {get() {return this.value || undefined},set(val) {this.$emit('input', val)}},attrs() {return {allowClear: true,showSearch: true,...this.$attrs}},selectChecked: {get() {return this.childSelectedValue?.length === this.optionSource?.length},set(val) {// console.log('set', val)this.$emit('input', val)}}},mounted() {document.addEventListener('click', this.bodyCloseMenus)},beforeDestroy() {document.removeEventListener('click', this.bodyCloseMenus)},methods: {// 点击空白区域bodyCloseMenus(e) {if (this.$refs.main && !this.$refs.main.contains(e.target)) {if (this.selectOpen == true) {this.selectOpen = false}}},// 点击全选selectAll(val) {const options = JSON.parse(JSON.stringify(this.optionSource))if (val.target.checked) {this.childSelectedValue = options?.map(item => {return item[this.valueKey]})setTimeout(() => {this.$emit('change', this.childSelectedValue)}, 0)} else {this.childSelectedValue = null}this.selectOpen = false},handleSelect(value, option) {if (value) {this.selectOpen = false}this.$emit('select', value, option)},// 切换分页currentChange(val) {// console.log('切换分页', val)if (!this.mode) {this.childSelectedValue = null}setTimeout(() => {this.selectOpen = true}, 0)this.$emit('current-change', val)},// 自定义label显示customLabelHandler(item) {// eslint-disable-next-line no-evalreturn eval(this.customLabel)}}
}
</script>
<style lang="scss">
.all_checkbox {margin-left: 12px;margin-top: 5px;
}
</style>

四、组件地址

gitHub组件地址

gitee码云组件地址

五、相关文章

基于ElementUi再次封装基础组件文档


基于ant-design-vue再次封装基础组件文档


vue3+ts基于Element-plus再次封装基础组件文档

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

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

相关文章

安装PS及AI遇到的问题

Mac安装PS/AI/PR/AE提示错误代码146 Failed with error code 146解决办法: 访达, -> 前往 ->前往文件夹 -> /Applications/Utilities/Adobe Sync 将Adobe Sync 文件夹里的CoreSync文件夹直接删掉

C++ 标准库随机数:std::default_random_engine

库头文件 #include <random> // 通过种子值设置随机数生成器 std::default_random_engine rng(seed);// 不设置种子值&#xff0c;使用默认值 std::default_random_engine rng; // 生成一个0到9之间的随机整数 int random_int rng() % 10;// 生成一个0到1之间的随机浮…

vivado crash

将增量编译去了

[Shell] ${} 的多种用法

文章目录 解释代码 解释 在Shell脚本中&#xff0c;${} 是一种变量替换语法。它用于获取和操作变量的值。 具体来说&#xff0c;${} 可以用来执行以下操作&#xff1a; 变量引用&#xff1a;${variable} 表示引用变量 variable 的值。 变量默认值&#xff1a;${variable:-de…

FPGA时序分析与约束(9)——主时钟约束

一、时序约束 时序引擎能够正确分析4种时序路径的前提是&#xff0c;用户已经进行了正确的时序约束。时序约束本质上就是告知时序引擎一些进行时序分析所必要的信息&#xff0c;这些信息只能由用户主动告知&#xff0c;时序引擎对有些信息可以自动推断&#xff0c;但是推断得到…

Sprint Cloud Stream整合RocketMq和websocket实现消息发布订阅

1.引入RocketMQ依赖&#xff1a;首先&#xff0c;在pom.xml文件中添加RocketMQ的依赖&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</versi…

文件改名,轻松添加前缀顺序编号,文件改名更高效!

您是否曾经需要批量修改文件名&#xff0c;并希望在文件名中添加特定的前缀或顺序编号&#xff1f;现在&#xff0c;我们为您带来了一款全新的文件改名工具&#xff0c;帮助您轻松解决这个问题&#xff01; 第一步&#xff0c;进入文件批量改名高手主页面&#xff0c;在板块栏…

C++学习笔记之四(标准库、标准模板库、vector类)

C 1、C标准库2、C标准模板库2.1、vector2.1.1、vector与array2.1.2、vector与函数对象2.1.3、vector与迭代器2.1.4、vector与算法 1、C标准库 C C C标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray)&#xff0c;它定义了十个大类…

js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件

js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件 js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件使用 FileReader js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件 使用 F…

【python爬虫】设计自己的爬虫 1. request封装

通过requests.session().request 封装request方法 考虑到请求HTTP/2.0 同时封装httpx 来处理HTTP/2.0的请求 封装requests # 遇到请求失败的情况时 重新请求&#xff0c;请求5次等待2s retry(stop_max_attempt_number5, retry_on_resultlambda re_data: re_data is None, wai…

亚马逊,速卖通,美客多如何打造爆款商品,排名提升榜首

1、产品Listing的完整性 Listing是亚马逊A9算法认识你产品的基础&#xff0c;在发布一条listing的时候&#xff0c;尽可能地做到最好!在准备一条listing之前&#xff0c;一定事先要收集、整理足够多的产品关键词&#xff0c;在优化listing内容的时候填充进去。仔细观察优秀竞品…

Realrek 2.5G交换机 8+1万兆光RTL8373-VB-CG方案简介

新一代2.5G交换机方案RTL8373-VB-CG可以提供4中不同形态 a. 52.5G 电口110G光》RTL8373 b. 52.5G 电口110G电》RTL83738261 c. 82.5G 电口110G光》RTL83738224 d.82.5G 电口110G电口》RTL837382248261 1.概述 Realtek RTL8373-CG是一款低功耗、高性能、高度集成的八端口2.5G和一…

C++设计模式_19_Memento 备忘录(理解,目前多使用序列化方案来实现)

Memento 备忘录模式也属于“状态变化”模式&#xff0c;它是一个小模式&#xff0c;在今天来看有些过时&#xff0c;当今已经很少使用当前模式实现需求&#xff0c;思想却不变&#xff08;信息隐藏&#xff09;&#xff0c;目前多使用序列化方案来实现。本系列所介绍的模式&…

小程序开发——小程序项目的配置与生命周期

1.app.json配置属性 app.json配置属性 2.页面配置 app的页面配置指的是pages属性&#xff0c; pages数组的第一个页面将默认作为小程序的启动页。利用开发工具新建页面时&#xff0c;则pages属性对应的数组将自动添加该页面的路径&#xff0c;若是在硬盘中添加文件的形式则不…

C++数据结构X篇_23_快速排序(最快、不稳定的排序)

文章参考十大经典排序算法-快速排序算法详解进行整理补充。快速排序是最快的排序方法。 排序思路&#xff1a;分治法-挖坑填数&#xff1a;大问题分解为各个小问题&#xff0c;对小问题求解&#xff0c;使得大问题得以解决 文章目录 1. 什么是快速排序1.1 概念1.2 算法原理1.3 …

手写常用的javascript函数

// 获取url参数 function getQueryString(name) {var reg new RegExp((^|&) name ([^&]*)(&|$), i);var r window.location.search.substr(1).match(reg);if (r ! null) {return unescape(r[2]);}return null; }// 验证手机号码(strict) function validPhoneNu…

Linux rm命令:删除文件或目录

当 Linux 系统使用很长时间之后&#xff0c;可能会有一些已经没用的文件&#xff08;即垃圾&#xff09;&#xff0c;这些文件不但会消耗宝贵的硬盘资源&#xff0c;还是降低系统的运行效率&#xff0c;因此需要及时地清理。 rm 是强大的删除命令&#xff0c;它可以永久性地删除…

一百九十七、Java——IDEA项目中把多层文件夹拆开显示

一、目的 由于IDEA项目中&#xff0c;默认的是把文件夹连在一起显示&#xff0c;于是为了方便需要把这些连在一起的文件夹拆开&#xff0c;分层显示 如文件夹cn.kgc 二、解决措施 解决方法很简单 &#xff08;一&#xff09;找到IDEA项目上的小齿轮 &#xff08;二&#xf…

基于深度学习的单图像人群计数研究:网络设计、损失函数和监控信号

摘要 https://arxiv.org/pdf/2012.15685v2.pdf 单图像人群计数是一个具有挑战性的计算机视觉问题,在公共安全、城市规划、交通管理等领域有着广泛的应用。近年来,随着深度学习技术的发展,人群计数引起了广泛的关注并取得了巨大的成功。通过系统地回顾和总结2015年以来基于深…

基于STM32的多功能智能密码锁控制设计

**单片机设计介绍&#xff0c;1653基于STM32的多功能智能密码锁控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 基于STM32的多功能智能密码锁控制设计是一种用STM32微控制器开发的系统&#xff0c;用于控制和管理密码…