基于Element的Select下拉选组件(支持快速全选)

news/2024/11/19 21:23:14/

Select下拉选增强 支持快速多选、tooltip等

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

1. quicklySelectAll: boolean 在多选模式下支持快速全选取消全选,默认开启

quicklySelectAll = true 快速选中init
quicklySelectAll = true 全部选中

<template><div id="app"><div class="container"><el-form ref="formRef" :model="formData" :rules="formRules"><el-form-item prop="selectVal" label="地区"><Check-All-Selectmultiple:quicklySelectAll="true"placeholder="请选择地区"v-model="formData.selectVal":optionList="options" /></el-form-item></el-form></div><el-button @click="submit">提交</el-button><el-button @click="reset">重置</el-button></div>
</template><script lang='ts'>
import Vue from 'vue'
import CheckAllSelect from '@/components/check-all-select'export default Vue.extend({name: 'App',components: {CheckAllSelect,},data () {return {formData: {selectVal: [],},formRules: {selectVal: [{required: true, message: '请选择'}]},options: [{ value: 3, label: "普陀" },{ value: 4, label: "黄埔", disabled: true },{ value: 5, label: "徐汇" },{ value: 8, label: "南京", disabled: true },{ value: 9, label: "苏州" },{ value: 10, label: "无锡" }]}},async mounted() {},methods: {submit() {const _: any = this;(this.$refs.formRef as any).validate((valid: boolean) => {if(valid) {_.$message.success('提交成功')} else {_.$message.error('form必填不通过')}})},reset() {(this.$refs.formRef as any).resetFields()}}
})
</script>

2. tooltip = true 展示选中的值,默认值false

2

<template><Check-All-Selectmultipletooltip:quicklySelectAll="true"placeholder="请选择地区"v-model="formData.selectVal":optionList="options" />
</template>
// 后续示例不展示<script>部分,和第一个示例一致

Attributes

属性名属性类型默认值描述版本
optionList[]-下拉选数据源-
quicklySelectAllbooleantrue快速选择(仅在多选模式下支持)-
tooltipbooleanfalse是否展值tooltip, 多选以,分割-
labelKeystringvalue值对应key-
valueKeystringlabellabel对应key-
disabledKeystringdisableddisabled对应key-

其他同elementUI Select组件属性

源码

<template><el-tooltip class="item" :disabled="tooltipDisabledData" effect="dark" :content="tooltipContent" placement="top-start"><el-select class="check-all-select" v-bind="$attrs" v-model="dataValue" :multiple="multiple"><el-option v-if="multiple && quicklySelectAll && optionsData.length" key="val_select_all_of_workflow" label="全选" value=""><div class="div_aaaa" style="width: 100%" @click="handleClickInner"><el-checkbox :indeterminate="isIndeterminate" v-model="checkAll">全选</el-checkbox></div></el-option><el-option v-for="item in optionsData" :key="item.value" :label="item.label" :value="item.value" :disabled="item.disabled" /></el-select></el-tooltip>
</template><script>export default {name: 'CheckAllSelect',props: {value: {type: [Array, String, Number],default: '',},multiple: {type: Boolean,default: false,},tooltip: {type: Boolean,default: true,},// 支持全选-只有在multiple为true下生效quicklySelectAll: {type: Boolean,default: true,},optionList: {type: Array,default: () => [],},labelKey: {type: String,default: 'label',},valueKey: {type: String,default: 'value',},disabledKey: {type: String,default: 'disabled',},},data() {return {checkAll: false,isIndeterminate: false,dataValue: '',};},computed: {optionsData() {return this.optionList.map(item => {return {label: item[this.labelKey],value: item[this.valueKey],disabled: item[this.disabledKey] || false,};});},// 除去 disabled 后可选的availableOptionsData() {return this.optionsData.filter(item => !item.disabled);},tooltipDisabledData() {return !this.tooltip || !this.value || (this.multiple && !this.value.length > 0);},tooltipContent() {if (!this.multiple) {return (this.optionsData.find(i => i.value === this.value) || {}).label || this.value;} else {const arr = [];this.value.forEach(key => {arr.push((this.optionsData.find(i => i.value === key) || {}).label || key);});return arr.join(',');}},},watch: {value: {immediate: true,handler(neeVal) {if (this.multiple) {let checkedCount = neeVal.length;this.checkAll = checkedCount > 0 && checkedCount === this.availableOptionsData.length;this.isIndeterminate = checkedCount > 0 && checkedCount < this.availableOptionsData.length;}this.dataValue = neeVal;},},dataValue(newVal) {this.$emit('input', newVal);},},methods: {handleClickInner(e) {this.checkAll = !this.checkAll;e.preventDefault();e.stopPropagation();this.$nextTick(() => {if (this.checkAll) {this.dataValue = [...(this.availableOptionsData.map(i => i.value) || [])];} else {this.dataValue = [];}});},},};
</script><style lang="scss" scoped>.check-all-select {::v-deep .el-input .el-input__inner {padding: 0 20px 0 10px;max-width: 100%;overflow: hidden;text-overflow: ellipsis;word-break: normal;white-space: nowrap;}}
</style>

码字不易,觉得有帮助的小伙伴点个赞支持下~


关注我的订阅号AIQ999~


http://www.ppmy.cn/news/124871.html

相关文章

Android进阶之路 - 字体阴影、文字阴影

最近几个月都挺忙&#xff0c;忙着工作&#xff0c;忙着成长… 一直以来我认为在开发中首当其冲的肯定是需求、功能&#xff0c;然后才是UI细节&#xff1b;所以我自己一般不太会去深究一些看不明显的UI&#xff0c;不过这俩日同事提醒我文字有阴影效果&#xff0c;细看之下果然…

VCD-影音光碟

VCD&#xff0c;影音光碟&#xff08;Video Compact Disc&#xff1b;VCD&#xff09;&#xff0c;是一种在光碟&#xff08;Compact Disk&#xff09;上存储视频信息的标准。VCD可以在个人电脑或VCD播放器以及大部分DVD播放器中播放。VCD标准由索尼、飞利浦、JVC、松下等电器生…

音箱电路原理图

现如今音视频方面的发展对生活起到了非常重要的作用&#xff0c;特别是智能硬件行业中&#xff0c;音视频以及连接技术&#xff08;WIFI&#xff0c;蓝牙等&#xff09;都尤为重要。今天就讲一下音箱的原理。音箱一般的作用就是对声音信号的外放&#xff0c;通常有播放器过来的…

电子元器件常用品牌汇总(持续更新)

电阻&#xff1a;Yageo国巨、Fenghua风华、Rohm罗姆、TDK、Samsung三星、Uniohm厚声、Walsin华新科、Ralec旺诠、KOA兴亚、Panasonic松下、AVX、TMTEC泰铭、Kyocera京瓷、PHYCOM飞元。 电容&#xff1a;Yageo国巨、Fenghua风华、Murata村田、TDK、Samsung三星、Eyang宇阳、Tai…

TNG AV-298 功放修理

买了新接头 安装上了&#xff0c;发现有右声道无声。 拆开修理功放。就不说修理的细节了。我是外行。哈 总之修好了&#xff0c;我的功放&#xff1a; PS.网友拆解的图&#xff1a; http://bbs.mydigit.cn/read.php?tid332851

io.netty项目UDP实现

要在Netty项目中实现UDP服务端&#xff0c;可以按照以下步骤进行操作&#xff1a; 添加Netty依赖&#xff1a;在项目的构建文件&#xff08;如Maven的pom.xml&#xff09;中添加Netty的依赖项&#xff0c;以便引入Netty库。 创建引导类&#xff08;Bootstrap&#xff09;&…

摄像机无线图传、摄像机无线视频传输、摄像机wifi视频传输

技术说明&#xff1a; 摄像机进行H265编码&#xff0c;接着摄像机将编码后的H265码流通过wifi发送给接收端&#xff08;解码器&#xff09;&#xff0c;接收端&#xff08;解码器&#xff09;收到H256码流后进行解码并通过HDMI接口输出显示。 摄像机为AP&#xff0c;接收端…

国产8K摄像机记录中国航展的飞速发展

总有一种声音&#xff0c;让人心生万千豪迈。总有一种影像&#xff0c;让人内心无比激荡。2022年11月8日-13日&#xff0c;第14届中国国际航空航天博览会在广东珠海盛大举办&#xff0c;国产博冠8K全画幅摄像机B1亮相活动现场&#xff0c;一幕幕震撼画面将在8K里留存。 60多年…