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-select
      v-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>

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

应用程序中实现用户隐私合规和数据保护合规的处理方案及建议

随着移动互联网的发展&#xff0c;用户隐私合规和数据保护合规已经成为应用开发过程中不可忽视的重要环节。为了帮助开发者实现隐私和数据保护合规&#xff0c;本文将介绍一些处理方案和建议。 图片来源&#xff1a;应用程序中实现用户隐私合规和数据保护合规的处理方案及建议 …

IOday5作业

使用两个线程完成两个文件的拷贝&#xff0c;分支线程1完成前一半内容拷贝&#xff0c;分支线程2完成后一半内容的拷贝&#xff0c;主线程完成资源的回收 #include<myhead.h> //定义结构体 struct file {const char* srcfile;//背拷贝文件路径const char* destfile;//拷…

LeetCode Hot100 200.岛屿数量

题目&#xff1a; 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以…

方法-TensorBoard如何在PC端远程可视化服务器的训练结果

本专栏为深度学习的一些技巧,方法和实验测试,偏向于实际应用,后续不断更新,感兴趣童鞋可关,方便后续推送 简介 TensorBoard 是 TensorFlow 的可视化工具&#xff0c;可以帮助用户实时监控深度神经网络的训练过程,基于PyTorch的训练过程也可以可视化。假设我在服务器上进行模型…

名创优品股份有限公司

用户简介 名创优品股份有限公司&#xff08;以下简称&#xff1a;名创优品&#xff09;奉行“简约、自然、富质感”的生活哲学和“回归自然&#xff0c;还原产品本质”的设计主张&#xff0c;秉承“尊重消费主义者”的品牌精神&#xff0c;致力于为全球消费者提供真正“优质、…

2-3、LOOP和CX

语雀原文链接 文章目录 1、loop示例pg 1、loop示例 编写loop.asm assume cs:code code segmentmov ax,2mov cx,11 s: add ax,axloop smov ax,4c00hint 21h code ends end编译链接 C:\>masm c:\loop; Microsoft (R) Macro Assembler Version 5.00 Copyright (C) Microsof…

2-4、DEBUG和源程序区别

语雀原文链接 文章目录 1、DEBUG 和 汇编编译器MASM区别1&#xff1a;默认进制不同区别2&#xff1a;[地址]示例1&#xff1a;debug示例2&#xff1a;[0]示例3&#xff1a;[寄存器]示例4&#xff1a;ds:[0]小结 区别3&#xff1a;源程序数据不能以字母开头 1、DEBUG 和 汇编编…

盒马补贴量价-2021KDD

概述&#xff1a; 电商商品定价三个关键问题&#xff1a; 在只有观测数据的时候&#xff0c;怎么构建价格弹性&#xff0c;现在来看这就是一个反事实推断的问题&#xff0c;不仅是如何做的问题&#xff0c;还有如何评估的问题。长周期的规划决策问题怎么建模 & 求解&#…

再识二叉树

1. 二叉树的存储 二叉树的存储结构分为&#xff1a;顺序存储和类似于链表的链式存储。 其中二叉树的链式存储是通过一个一个的节点引用起来的&#xff0c;常见的表示方式有二叉和三叉表示方式&#xff08;这里本主主要讲的是链式存储&#xff09;&#xff0c;具体代码如下&…

「海蓝色」海关可视化监管平台,助力海关体系实现规范化程序管理

海关监管是国家对进出境货物、旅客和邮件进行检查和控制的重要机构&#xff0c;其职责是保障国家的安全和经济利益。海关监管的核心目标是防止非法进出境活动&#xff0c;包括走私、偷逃税款等行为。海关监管通过检查和核实货物的品质、数量和价值&#xff0c;确保货物符合相关…

6-4 是否二叉搜索树 分数 20

bool IsBST(BinTree T) {//空树 or 只有一个结点if (T NULL || (T->Left NULL) && (T->Right NULL))return true;BinTree cur NULL;cur T->Left;if (cur ! NULL){while (cur->Right)cur cur->Right;if (cur->Data > T->Data)return fals…

【实用经验】如何根据CVE编号找到安全补丁

找到对应补丁页面 例如查找编号为 CVE-2019-0708 的漏洞&#xff0c;访问下面链接即可&#xff0c;替换末尾编号可获取其他漏洞更新补丁。 https://msrc.microsoft.com/update-guide/vulnerability/CVE-2019-0708根据实际情况点击右侧补丁链接即可跳转下载 最后根据实际情况下…

【Docker】从零开始:18.使用Dockerfile构造自己的KingbaseES数据库镜像

【Docker】从零开始&#xff1a;17.使用Dockerfile构造自己的数据库镜像 新建一个自定义目录并创建Dockerfile文件上传需要的文件到自定义目录下注意docker-circle-init.sh文件内容password 内容 开始打包注意打包完成后执行 尝试用工具连接数据库 kingbase.tar.gz 包过大我就上…

java每日一记 —— 常见的Bean后置处理器

此代码在jdk11上测试通过&#xff0c;SpringBoot版本为2.7.14 1.上代码 1.测试方法 public class Dome04Application {public static void main(String[] args) {// 这是一个干净的容器GenericApplicationContext context new GenericApplicationContext();// 添加3哥Beanc…

git-vscode

git-vscode ctrlshiftp 创建分支 create branch 直接切到新的分支了 切换分支 直接点左下角自己选择 vscode中配置仓库 https://blog.csdn.net/zora_55/article/details/129709251 推送tag tag作用就是在 Git 中&#xff0c;标记存储库历史记录中特定提交的一种方式。t…

SkyWalking9.x搭建

简介 Skywalking是一款分布式的系统 性能监视工具&#xff0c;专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking是一款 观察性的分析平台和应用性能管理系统&#xff0c;提供了 分布式追踪、性能指标分析、应用服务依赖分析、可视化一体化等解决方…

devops-exercises:DevOps 工程师的面试学习资料 | 开源日报 No.95

bregman-arie/devops-exercises Stars: 58.8k License: NOASSERTION 这个项目是一个包含各种技术主题的问题和练习集合&#xff0c;有时与 DevOps 和 SRE 相关。 2624 道练习和问题包含了许多涉及 DevOps、Git、网络等方面的问题和演示文稿可以用于面试准备&#xff0c;但大多…

在Ascend昇腾硬件用npu加速paddleLite版本ocr(nnadapter)

在Ascend昇腾硬件用npu加速paddleLite版本ocr&#xff08;nnadapter&#xff09; 参考文档* nnadapter参考文档地址* 华为昇腾 NPU参考文档地址* PaddleLite的CAPI参考文档 一.确保cpu版本运行正常二.编译Ascend上npu加速库三.跑通npu加速版本Demo1.Demo下载地址2.参考手册网址…

选择更好的Notes索引附件方式

大家好&#xff0c;才是真的好。 首先介绍最近产品更新消息。在上一周&#xff0c;HCL主要发布了以下几个产品更新&#xff1a;HCL Verse 3.2.0、HCL Volt MX Go 2.0.2、HCL Domino Rest API 1.0.8。 HCL Verse是今后Domino的产品当中主要使用的webmail功能&#xff0c;这一次…

Linux Component概述和高通V4l2驱动模型

1 Linux为什么要引入Component框架&#xff1f; 为了让subsystem按照一定顺序初始化设备才提出来的。 subsystem中由很多设备模块&#xff0c;内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video …