vue el-select多选封装及使用

news2025/2/25 0:13:12

在这里插入图片描述

使用了Element UI库中的el-select和el-option组件来构建多选下拉框。同时,也包含了一个el-input组件用于过滤搜索选择项,以及el-checkbox-group和el-checkbox组件用于显示多选项。

创建组件index.vue (src/common-ui/selectMultiple/index.vue)
<template>
  <el-select
      ref="select"
      v-model="hValue"
      multiple
      collapse-tags
      :clearable="clearable"
      :disabled="disabled"
      :placeholder="placeholder"
      :popper-class="'select-default no-empty'"
      :key="poperKeyValue"
      :value-key="valueKey"
      @blur="handleBlur"
      @change="handleChange"
      @clear="handleClear"
      @focus="handleFocus"
      @remove-tag="handleRemoveTag"
      @visible-change="handleVisibleChange"
  >
    <el-input
        class="filter-input"
        v-model.trim="hFilterVal"
        v-if="filterable"
        :class="selectInfo.options.length == 0 ? 'filter-input-mb' : ''"
    ></el-input>

    <el-checkbox-group v-model="hValue">
      <el-option
          v-for="(item, index) in selectInfo.options"
          :key="index"
          :label="
          selectInfo.prop && selectInfo.prop.label
            ? item[selectInfo.prop.label]
            : item.name
        "
          :disabled="item.disabled"
          :value="
          selectInfo.prop && selectInfo.prop.value
            ? item[selectInfo.prop.value]
            : item.id
        "
      >
        <el-checkbox
            style="pointer-events: none"
            :label="
            selectInfo.prop && selectInfo.prop.value
              ? item[selectInfo.prop.value]
              : item.id
          "
        >{{
          selectInfo.prop && selectInfo.prop.label
          ? item[selectInfo.prop.label]
          : item.name
          }}
        </el-checkbox>
      </el-option>
    </el-checkbox-group>
  </el-select>
</template>

<script>
  export default {
    name: "HSelectMul",
    props: {
      placeholder: String,
      selectInfo: {
        type: Object,
        default() {
          return {
            align: "left",
            options: [],
            filterOptions: [],
            prop:{
              label:'name',
              value:'id'
            }
          };
        }
      },
      filterVal:{
        type:String,
        value:''
      },
      clearable: {
        type: Boolean,
        default: true
      },
      disabled: {
        type: Boolean,
        default: false
      },
      filterable: {
        type: Boolean,
        default: true
      },

      value: {
        type: [String, Number, Array, Boolean],
        required: true
      },
      valueKey: String,

      keyValue: {
        type: String,
        default: "select-single"
      }
    },
    data() {
      return {
        poperKeyValue: ""
      };
    },
    computed: {
      hValue: {
        get() {
          let value = [];
          if (this.value instanceof Array) {
            this.value.forEach(key => {
              if (this.checkValueExisting(key)) {
                value.push(key);
              }
            });
          }
          return value;
        },
        set(value) {
          this.$emit("input", value);
        }
      },
      hFilterVal: {
        get() {
          return this.filterVal;
        },
        set(value) {
          this.$emit("input-search", value);
        }
      },
    },
    watch: {
      keyValue(val) {
        this.poperKeyValue = val;
      }
    },
    methods: {
      checkValueExisting(value) {
        let key = this.selectInfo.prop&&this.selectInfo.prop.value?this.selectInfo.prop.value:'id'
        if(this.filterable) {
          if (this.selectInfo.filterOptions instanceof Array) {
            let index = this.selectInfo.filterOptions.findIndex(
                item => item[key] === value,
                this
            );
            return index > -1;
          }
        } else {
          if (this.selectInfo.options instanceof Array) {
            let index = this.selectInfo.options.findIndex(
                item => item[key] === value,
                this
            );
            return index > -1;
          }
        }

        return false;
      },
      handleBlur(event) {
        this.$emit("blur", event);
      },
      handleChange(value) {
        this.$emit("change", value);
      },
      handleClear() {
        this.$emit("clear");
      },
      handleFocus(event) {
        this.$emit("focus", event);
      },
      handleRemoveTag(tag) {
        this.$emit("remove-tag", tag);
      },
      handleVisibleChange(visible) {
        this.$emit("visible-change", visible);
      }
    }
  };
</script>

<style lang="scss" scoped></style>


页面引入
  • 在需要使用selectMultiple组件的地方,通过import语句组件注册并使用

<template>
  <div>
    <HSelectMultiple
        :select-info="selectInfo"
        v-model="selectedValue"
        :filter-val="filterVal"
        @input-search="dropDownSearchTop"
        @change="changeSelect"
    >
    </HSelectMultiple>
  </div>
</template>
<script>
  import HSelectMultiplefrom '@/common-ui/selectMultiple/index'

  export default {
    components: {
      HSelectMultiplefrom 
    },
    data() {
      return {
        filterVal: '',
        dataSource: [],
        selectedValue: '',
        selectInfo: {
          align: "left",
          options: [],
          filterOptions: [],
          prop: {
            label: 'name',
            value: 'id'
          }
        },
      }
    },
    methods: {
      changeSelect(val, field, parentField, info) {
        this.selectInfo.chooseSelectList = [];
        for (let i = 0; i < this.selectInfo.filterOptions.length; i++) {
          for (let j = 0; j < val.length; j++) {
            let value = this.selectInfo.prop && this.selectInfo.prop.value ? this.selectInfo.prop.value : "id";
            if (val[j] === this.selectInfo.filterOptions[i][value]) {
              this.selectInfo.chooseSelectList.push(this.selectInfo.filterOptions[i]);
            }
          }
        }

        console.log(val, '选择的值')
      },
      dropDownSearchTop(val) {
        this.filterVal = this.selectInfo.filterVal;
        if (this.selectInfo.filterVal === "") {
          this.selectInfo.options = JSON.parse(JSON.stringify(this.selectInfo.filterOptions));
          return;
        }
        let list = [];
        if (this.selectInfo.chooseSelectList.length > 0) {
          list = this.selectInfo.filterOptions.filter(item => {
            let value = ithis.selectInfonfo.prop && this.selectInfo.prop.value ? this.selectInfo.prop.value : "id";
            return this.selectInfo.chooseSelectList.every(el => el[value] != item[value]);
          });
        } else {
          list = JSON.parse(JSON.stringify(this.selectInfo.filterOptions));
        }
        this.selectInfo.options = this.selectInfo.chooseSelectList.concat(
            list.filter(item => {
              let name = this.selectInfo.prop && this.selectInfo.prop.label ? this.selectInfo.prop.label : "name";
              return item[name].includes(this.selectInfo.filterVal);
            })
        );
      },
    }
    // ...
  }
</script>

确保你已经安装了Vue.js和Element UI,并在项目中引入它们。

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

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

相关文章

宝塔部署appache部署ssl证书无法访问443端口

原因&#xff1a; 不是部署方法错误&#xff0c;而是操作不当&#xff0c;原来一开始为了测试我去修改了appache默配置路径下的httpd-ssl.donf&#xff0c;此文件一般 在appche/conf/extra/目录下&#xff08;版本不同目录可能有所区别&#xff09;。 导致问题&#xff1a; 在…

java连接池 理解及解释(DBCP、druid、c3p0、HikariCP)

一、在Java开发中&#xff0c;有许多常见的数据库连接池可供选择。以下是一些常见的Java数据库连接池&#xff1a;不使用数据库连接池的特性&#xff1a; 优点&#xff1a;实现简单 缺点&#xff1a;网络 IO 较多数据库的负载较高响应时间较长及 QPS 较低应用频繁的创建连接和关…

高低压供配电智能监控系统

高低压供配电智能监控系统是一种综合运用物联网、云计算、大数据和人工智能等技术的智能化监控系统&#xff0c;用于实时监测高低压供配电设备的运行状态和电能质量&#xff0c;及时发现和处理供配电系统中存在的问题&#xff0c;提高供配电系统的安全性和可靠性。依托电易云-智…

漏洞复现--万户ezoffice wpsservlet任意文件上传

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

A股风格因子看板 (2023.12第1期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景 露组合等。 今日为该因子跟踪第1期&#xff0c;指数组合数据截止日2023-11-30&#xff0c;要点如下 近1年A股风格因子收…

如何理解方块电阻与宽度的关系(RPSQ_VS_SI_WIDTH)

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 来自星球提问: 解释如下: 单看方块电阻的公式&#xff0c;Rs&#xff1d;电阻率/厚度 在半导体制造过程中&#xff0c;由于工艺偏差&#xff0c;电阻跟金属线的density是相关的…

windows10系统下替换、修改jar中的文件并重新打包成jar文件然后运行

目录 1、jar文件简述2、问题来源3、操作步骤3.1 解压jar包3.2 替换或者更改操作3.3 重新打成jar包3.4 确认是否修改成功3.5 运行程序 附录&#xff1a;常见命令参数 1、jar文件简述 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的…

IntelliJ IDEA 2023.2新特性详解第三弹!Docker、Kubernetes等支持!

9 Docker 在 Docker 镜像层内预览文件 现在可以在 Services&#xff08;服务&#xff09;工具窗口中轻松访问和预览 Docker 镜像层的内容。 从列表选择镜像&#xff0c;选择 Show layers&#xff08;显示层&#xff09;&#xff0c;然后点击 Analyze image for more informati…

电气自动化专业求职简历11篇

电气自动化专业求职简历下载&#xff08;可在线编辑制作&#xff09;&#xff1a;来幻主简历&#xff0c;做好简历&#xff01; 电气自动化专业简历1&#xff1a; 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;自动化工程师 意向城市&#xff1a;广东广州…

二维码智慧门牌管理系统升级解决方案:优化制牌存疑管理

文章目录 前言一、解决方案关键特点二、解决方案的优势 前言 二维码智慧门牌管理系统在城市管理中发挥着重要作用&#xff0c;然而&#xff0c;制牌审核过程中遇到存疑地址数据是常见问题&#xff0c;需要更有效的处理方法。为此&#xff0c;我们提出了二维码智慧门牌管理系统…

编写并调试运行一个简单的 Java 应用程序,显示自己的学号、姓名、兴趣爱好等。

源代码&#xff1a; public class Main { public static void main(String[] args) { System.out.println("学号是:""0233217821"); System.out.println("姓名是:""赵港"); System.out.println("兴趣爱好是:""运动&qu…

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南)

es自2020年的8.x版本以来&#xff0c;就提供了机器学习的能力。我们可以使用es官方提供的工具eland&#xff0c;将hugging face上的NLP模型&#xff0c;上传到es集群中。利用es的机器学习模块&#xff0c;来运维部署管理模型。配合es的管道处理&#xff0c;来更加便捷的处理数据…

软件性能测试之压力测试详解

压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&#xff0c;并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试&#xff0c;并评估软件在极端条…

15:00的面试,15:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

【AI绘画】万字长文——(超详细)ControlNet的详细介绍使用Stable Diffusion的艺术二维码完全生成攻略

目录 前言一、名词解释1-1、Stable Diffusion介绍1-2、ControlNet介绍1-2-1、ControlNet介绍&工作原理1-2-2、ControlNet控制方法介绍 1-3、案例分析1-3-1、室内装修设计1-3-2、品牌创意海报 1-4、stable-diffusion-webui 的参数解释 二、生成方法2-1、图像到图像2-1-1、二…

NSS [HUBUCTF 2022 新生赛]Calculate

NSS [HUBUCTF 2022 新生赛]Calculate 题目描述&#xff1a;python is a good tool in CTF 需要答对20题&#xff0c;每题回答时间&#xff08;其实就是两次发包之前的间隔&#xff09;要大于一秒小于三秒。 抓个包&#xff0c;我们的答案是POST发包。并且在这里看到了cookie&…

Docker—共享应用程序

现在您已经构建了一个映像&#xff0c;可以共享它。要共享Docker映像&#xff0c;您必须使用Docker注册表。默认注册表是Docker Hub&#xff0c;是您使用的所有图像的来源。 Docker ID&#xff08;Docker标识&#xff09; Docker ID允许您访问Docker Hub&#xff0c;这是世界上…

25、pytest的测试报告插件allure

allure简介 在这里&#xff0c;你将找到使用allure创建、定制和理解测试报告所需的一切。开始让你的测试沟通更清晰&#xff0c;更有影响力。 Allure Report是一个实用程序&#xff0c;它处理由兼容的测试框架收集的测试结果并生成HTML报告。 安装allure 1、确保安装了Java…

力扣 --- H指数

题目描述&#xff1a; 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff…

北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(2)彩虹呼吸灯(bug已解决 更新至3.0)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1一些更新和讲解 1.2改正后的…