el-select的多选multible带全选组件二次封装(vue2,elementUI)

1.需求

Select 选择器 多选需要增加 全选取消全选 功能,前端框架为vue2,UI组件为elementUI。

2. 代码

  1. html部分
<template><el-tooltip effect="dark" :disabled="defaultValue.length <= 0" :content="defaultValue.join('、')" placement="top"><el-selectv-model="value":multiple="true"collapse-tags:disabled="disabled":placeholder="placeholder"@change="selectChange"><el-option v-if="needSelectAll && defaultOptions.length > 0" :label="selectAllLabel" :value="selectAllValue">{{ defaultOptions.length === defaultValue.length ? '取消' : '' }}{{ selectAllLabel }}</el-option><el-option v-for="(each, i) in defaultOptions" :key="i" :label="each.label" :value="each.value" /></el-select></el-tooltip>
</template>
  1. js部分
export default {props: {defaultValue: {type: [Array, String, Number],default() {return [];}},disabled: {type: Boolean,default() {return false;}},placeholder: {type: String,default() {return '';}},defaultOptions: {type: Array,default() {return [];}},needSelectAll: {type: Boolean,default() {return false;}},selectAllLabel: {type: String,default() {return '全部';}}},data() {return {value: [],selectAllValue: 'all全部'};},watch: {defaultValue() {this.initData();}},created() {this.initData();},methods: {updateVal(val, needEmit) {const { defaultOptions } = this;const list = defaultOptions.map(item => item.value);this.$emit('update:defaultValue', val.filter(item => list.indexOf(item) >= 0));if (needEmit) {this.$nextTick(() => {this.$emit('change', this.defaultValue);});} else { /**/ }},selectChange(val) {const { needSelectAll, selectAllValue, value, defaultValue, defaultOptions } = this;let arr = value.slice();if (needSelectAll) {arr = arr.filter(item => item !== selectAllValue);if (!this.judgeArrValEqual(arr, defaultValue)) {this.updateVal(arr);} else {if (value.indexOf(selectAllValue) >= 0) {if (arr.length < defaultOptions.length) {defaultOptions.forEach(item => {if (value.indexOf(item.value) < 0) {value.push(item.value);} else { /**/ }});this.updateVal(value.filter(item => item !== selectAllValue));} else { /**/ }} else {value.splice(0, value.length);this.updateVal([]);}}} else {if (!this.judgeArrValEqual(arr, defaultValue)) {this.updateVal(arr);} else { /**/ }}},judgeArrValEqual(list1, list2) {list1 = list1 && list1.length > 0 ? list1 : [];list2 = list2 && list2.length > 0 ? list2 : [];const arr1 = list1.slice().sort();const arr2 = list2.slice().sort();if (arr1.join(',') === arr2.join(',')) {return true;} else {return false;}},initData() {const { defaultValue, defaultOptions, value, needSelectAll, selectAllValue } = this;if (typeof defaultValue === 'string') {this.updateVal(defaultValue.split(','), false);return;} else if (typeof defaultValue === 'number') {this.updateVal([defaultValue]);return;} else { /**/ }value.splice(0, value.length);if (needSelectAll) {if (defaultValue.length === defaultOptions.length && defaultOptions.length > 0) {value.push(selectAllValue);} else {const selectAllIndex = value.indexOf(selectAllValue);if (selectAllIndex >= 0) {value.splice(selectAllIndex, 1);} else { /**/ }}} else { /**/ }value.push(...defaultValue);}}
};

3.解析

  1. Tooltip 文字提示 用来悬浮多选折叠提示,并设置无值时不需要提示处理。
  2. 在组件初始化和监听传参defaultValue变化时调用initData初始化数据。
  3. 当选择组件数据切换时调用selectChange完善数据全选和取消全选。
  4. 通过调用updateVal方法出发异步数据defaultValue更新,并按需传递change事件。

4. 具体使用

<template><SelectMultibleAll:default-value.sync="value":default-options="options":placeholder="请选择":need-select-all="needSelectAll":disabled="disabled"@change="selectChange"/>
</template><script>
import SelectMultibleAll from '@/components/SelectMultibleAll.vue';export default {components: { SelectMultibleAll  },data() {return {value: [],options: [{ label: '选项1', value: '值1' },{ label: '选项2', value: '值2' }]needSelectAll: true,disabled: false}},methods: {selectChange(val) {console.log(val);}}
}
</script>

效果
在这里插入图片描述
代码下载

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

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

相关文章

信号完整性分析

目录 前言一、信号完整性SI1.1 信号失真1.2 串扰1.3 衰减 二、电源完整性PI2.1 地弹2.2 电源轨道塌陷 三、电磁兼容EMC3.1 电磁辐射3.2 抗干扰 前言 本篇介绍信号完整性分析的知识体系&#xff0c;以及部分分析方法。   什么是信号完整性?通俗来讲&#xff0c;信号在互连线的…

MySQL数据库从小白到入门(二)

多表关系&#xff1a; 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构。由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种。 外键&#xff1a; 创…

BPM、ERP、OA 各自的功能和特点是什么?怎么配合使用?

OA、BPM、ERP几乎是任何一家企业都会接触到的信息管理系统及程序。 首先&#xff0c;我从定义上理清BPM、ERP和OA ERP(Enterprise Resource Planning,企业资源计划)&#xff0c;一般围绕供应链、生产制造和财务为核心。 BPM&#xff08;business process management&#xf…

低代码你需要了解一下

低代码的概念可以追溯到1980年代&#xff0c;当时IBM的快速应用程序开发工具&#xff08;RAD&#xff09;被冠以新的名称——低代码&#xff0c;由此&#xff0c;低代码的概念首次面向大众。然而&#xff0c;在近40年的历程中&#xff0c;低代码发展经历了两个阶段&#xff1a;…

阿里年薪50w和5w都是如何进行需求分析,过来围观!

工作中难免会遇到并不“完美”的需求文档&#xff0c;比如牵一发而动全身却不清晰的交互逻辑、子条目频繁的变更、交流缺失导致的歧义等&#xff0c;都会让测试在项目推进中手足无措。 一份好的需求文档&#xff0c;不止能够加速开发和测试的脚步&#xff0c;还能够提前发现风…

Android音视频开发入门学习路线(基础知识+硬解码+技术分享)

随着5G基站的不断建设&#xff0c;大家已经可以明确的感知到目前市场上各大企业对于音视频人才的需求&#xff0c;市场招聘音视频岗位薪资亦是水涨船高&#xff01; 但Android 音视频开发想要自学却难度很高&#xff0c;不仅需要掌握图像、音频、视频的基础知识&#xff0c;并…

docker 可视化工具操作说明 portainer

官网地址 https://docs.portainer.io/start/install-ce/server/docker/linux 1.First, create the volume that Port docker volume create portainer_data2.下载并安装容器 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restartalways -v /var/run/docker…

Django之admin后台页面功能详解

一&#xff09;对于admin的初了解 1.简介 Django是一种流行的Python Web开发框架&#xff0c;它提供了一个功能强大且易于使用的admin界面&#xff0c;用于管理网站的后台数据和功能。Django的admin界面是自动生成的&#xff0c;它根据你的模型类自动创建表单和列表视图。你只…

【科普】什么是电子印章? PS抠的印章能用吗?

各类扣章教程一搜一大堆&#xff0c;说明大家对于电子印章使用需求很高。不过要谨记&#xff0c;不要随便抠印章用于公文、证明书、合同协议、收据发票等电子文件&#xff0c;否则可能会吃牢饭。 单是一张电子化的图片是不具备合法性的。那有的人就要问了&#xff0c;我见到的…

掌汇云 | 全场景数据追踪,多维了解用户偏好,提高运营效率

掌汇云拥有黄金“三件套”&#xff1a;掌头条、汇互动、云品牌。群硕借助这些功能套件&#xff0c;面向细分领域如&#xff1a;会展&#xff0c;食品饮料、医药以及工业等&#xff0c;定制综合性信息服务平台&#xff0c;提供资讯、商机、企业人脉、上下游资源、活动等高质量服…

(分类)KNN算法- 参数调优

在此专栏的上一篇文章的基础上&#xff0c;进行交叉实验获取最佳的K值 上一篇文章&#xff1a;KNN算法案例-鸢尾花分类 数据拆分的过程&#xff1a; 交叉验证&#xff08;Cross Validation&#xff09; 是一种在机器学习中广泛使用的模型评估和参数调优方法。在训练模型时&…

Linux存储软件栈到底有多复杂,存储软件栈全景概览

从今天开始&#xff0c;我们将介绍一下Linux的存储软件栈&#xff0c;也称为IO栈。今天我们先从整体上了解一下Linux的整个IO栈&#xff0c;后续再深入介绍每个组件。我们很难说清楚Linux的存储软件栈到底有多复杂&#xff0c;但thomas-krenn的一张图可能可以给大家一个比较直观…