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

news2024/9/22 1:12:20

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-Select
            multiple
            :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-Select
    multiple
    tooltip
    :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.coloradmin.cn/o/594300.html

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

相关文章

Framework开发环境搭建

Framework开发环境搭建 开启Android Framework之旅&#xff0c;一步步记录自己学习过程。 硬件配置 RAM&#xff1a;最低16GB&#xff0c;建议32GB&#xff0c;有条件64GB&#xff0c;内存越高&#xff0c;编译时间越短ROM&#xff1a;最低400GB&#xff0c;代码250GB构建15…

第八篇、基于Arduino uno,获取MAX30102心率传感器的心率信息——结果导向

0、结果 说明&#xff1a;先来看看串口调试助手显示的结果&#xff0c;第一个值是原始的IR值&#xff0c;第二个值是实时的心跳&#xff0c;第三个值是平均心跳&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;MAX30102心率传感器的外观如下…

Linux:开机自动挂载磁盘出错 两种解决办法 /etc/fstab

假如在/etc/fstab文件中有一个错误的语句 但是我们假装不知道&#xff0c;直接给他重启 第一种 开机自动进入到一个这样的界面 在这我们直接输入root的密码 进入到root下 直接 vi /etc/fstab 先将错误的删除掉&#xff0c;等正常开机了再去做挂载 然后重启 正常进入系统 第二…

基于机智云物联网平台的智能种树小车

前言:针对目前人工种树效率低的问题&#xff0c;设计了一种全自助高效智能种树小车。介绍了装置的结构组成&#xff0c;剖析了装置的运动机理。通过SolidWorks三维软件对传动部件进行了结构设计。 利用蓝牙模块实现了种植过程的信息传递、发送命令等&#xff0c;物联网机智云模…

Fiddler+Proxifer 实现PC端软件的抓包

FIddlerProxifer 实现PC端软件的抓包 下载Proxifer https://www.proxifier.com/download/ Proxifier配置 默认是关闭HTTP协议的&#xff0c;使用需要配置开启&#xff0c;配置文件->高级->HTTP代理服务器->启用HTTP代理服务器支持 配置Proxifer代理服务器&#x…

4.数据结构期末复习之森林和最优二叉树(哈夫曼树)

1.森林的定义&#xff1a;m>0 颗互不相交的树的集合 //树和森林的区别 2.森林的遍历 for森林里的树(前序和后序遍历) 3.树转二叉树(兄弟连起来,去右线) 1.兄弟之间加线(树和树之间不加) 2.右孩子去线(只保留第一个结点的线) 3.顺时针调整45度位置变成二叉树 4.森林转二叉…

网络安全 2023 年为什么如此吃香?事实原来如此.....

前言 由于我国网络安全起步晚&#xff0c;所以现在网络安全工程师十分紧缺。俗话说:没有网络安全就没有国家安全 为什么选择网络安全&#xff1f; 十四五发展规划建议明确提出建设网络强国&#xff0c;全面加强网络安全保障体系和能力建设&#xff0c;加强网络文明建设&#x…

OpenGl之变换

目录 缩放 位移 齐次坐标(Homogeneous Coordinates) 旋转 缩放 对一个向量进行缩放(Scaling)就是对向量的长度进行缩放&#xff0c;而保持它的方向不变。由于我们进行的是2维或3维操作&#xff0c;我们可以分别定义一个有2或3个缩放变量的向量&#xff0c;每个变量缩放一个轴…

软件测试之-测试用例写作规范

软件测试用例得出软件测试用例的内容&#xff0c;其次&#xff0c;按照软件测试写作方法&#xff0c;落实到文档中&#xff0c;两者是形式和内容的关系&#xff0c;好的测试用例不仅方便自己和别人查看&#xff0c;而且能帮助设计的时候考虑的更周。 一个好的测试用例必须包含…

语音信号处理——噪声抑制

简介 噪声抑制技术用于消除背景噪声&#xff0c;改善语音信号的信噪比和可懂度&#xff0c;让人和机器听的更清楚常见的噪声种类&#xff1a;人声噪声、街道噪声、汽车噪声噪声抑制方法的分类&#xff1a; 按照输入通道数分&#xff1a;单通道降噪、多通道降噪按照噪声统计特性…

Overview of Blockchain区块链概述

目录 1.def 2.smart contract 3.Consensus mechanism 4.blockchain fork 比特币诞生的几年后&#xff0c;人们开始意识到区块链技术本身的潜力&#xff0c;慢慢走出了自己的发展路线。 通常区块链被定义为一种去中心化的分布式账本技术&#xff0c;最初用来记录信息&#x…

洛谷——SP1-TEST - Life, the Universe, and Everything +注册SPOJ的方法

文章目录 TEST - Life, the Universe, and Everything题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示Information注意注册SPOJ的方法我应该如何注册 SPOJ&#xff1f;注册流程原因 AC代码 TEST - Life, the Universe, and Everything 题面翻译 从输入读…

从零搭建微服务-注册中心(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 核心依赖 需要注册配置中心的服务引入下面 …

CountDownLatch详解以及用法示例

一、什么是CountDownLatch CountDownLatch中count down是倒数的意思&#xff0c;latch则是门闩的含义。整体含义可以理解为倒数的门栓&#xff0c;似乎有一点“三二一&#xff0c;芝麻开门”的感觉。 CountDownLatch的作用也是如此&#xff0c;在构造CountDownLatch(int coun…

订单管理轻松上手:低代码平台助力企业数字化转型

随着电子商务的发展和普及&#xff0c;企业的订单管理工作变得越来越复杂&#xff0c;传统的手工处理方式已经无法满足企业的需求&#xff0c;需要一种更高效、更精确、更可靠的订单管理方式。而低代码技术正是满足这一需求的一种有效解决方案。 一、订单管理的重要性 企业的…

高频面试八股文原理篇(三)Array,Vector,ArrayList和LinkedList区别

目录 数组(Array)和列表(ArrayList)的区别 Arrays工具类 Vector,ArrayList, LinkedList的区别 ArrayList扩容机制&#xff08;原理) arrayList为什么线程不安全&#xff1f; 数组(Array)和列表(ArrayList)的区别 Array可以包含基本类型和对象类型&#xff0c;ArrayList只能…

电脑重装系统后,打印机驱动没了怎么办

驱动人生获悉&#xff0c;据微软最新消息&#xff0c;23年6月将对Windows 10进行强制升级&#xff0c;自动升级到22H2版本。不少用户听闻后&#xff0c;开始纷纷将系统重装到了Windows 11等&#xff0c;不过升级也以为着很多系统的东西需要推倒重来&#xff0c;其中就包括打印机…

Jupyter Notebook如何导入导出文件

目录 0.系统&#xff1a;windows 1.打开 Jupyter Notebook 2.Jupyter Notebook导入文件 3.Jupyter Notebook导出文件 0.系统&#xff1a;windows 1.打开 Jupyter Notebook 1&#xff09;下载【Anaconda】后&#xff0c;直接点击【Jupyter Notebook】即可在网页打开 Jupyte…

【C++中map和unordered_map存储自定义类型需要做什么】

目录 一、map存储自定义类型 二、unordered_map存储自定义类型 一、map存储自定义类型 需要传入的参数是key-value键值对&#xff0c;和仿函数类型 对于内置类型&#xff0c;int、double、char重载了operator<所以传入less仿函数不会出错 但是对于自定义类型&#xff0c;如…

MySQL 视图 浅入浅出

前提 最近公司接了一个项目&#xff0c;项目是将一份内容丰富且包含大量数据透视表&#xff08;之所以称为数据透视表&#xff0c;是因为可以动态地改变它们的版面布置&#xff0c;以便按照不同方式分析数据&#xff0c;也可以重新安排行号、列标和页字段。每一次改变版面布置…