element ui dropdown下拉 复选框+全选+搜索功能 组件 (开箱即食)

2023-10-29

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

element ui dropdown下拉 复选框+全选+搜索功能 组件 (开箱即食)
可以传入默认值默认选中,可以全选,可以搜索,点击确定把选中的值传给父级,开箱即食

<template>
  <div>
    <!-- 下拉有多选功能  还能输入搜索 -->
    <el-dropdown trigger="click" @visible-change="onVisibleChange" class="dropdown">
      <span class="el-dropdown-link">
        下拉菜单<i class="el-icon-arrow-down el-icon--right"></i>
      </span>
      <el-dropdown-menu slot="dropdown" :hide-on-click="false">
        <div class="drop">
          <div style="width: 100%">
            <el-input
              v-model="input"
              @input="inputEvent"
              class="input"
              size="mini"
              prefix-icon="el-icon-search"
              placeholder="搜索"
              clearable
              style="width: 100%"
            >
            </el-input>
          </div>
          <el-checkbox
            :indeterminate="isIndeterminate"
            v-model="checkAll"
            @change="handleCheckAllChange"
            class="checkAlls"
          >
            全选
          </el-checkbox>
          <div class="checkAllLine"></div>
          <el-checkbox-group
            v-model="isCheckIdList"
            v-if="checkboxLists.length > 0"
            @change="handleCheckedChange"
          >
            <div class="checkboxLists">
              <el-checkbox
                v-for="item in checkboxLists"
                :label="item[keys]"
                :key="item[keys]"
                style="display: block"
                class="checiboxItem"
              >
                {{ item.label }}
              </el-checkbox>
            </div>
          </el-checkbox-group>
          <div v-if="checkboxLists.length === 0" class="noData">无数据</div>
          <div class="footer">
            <el-button type="primary" plain size="mini" class="footer_close">
              关 闭
            </el-button>
            <el-button type="primary" size="mini" class="footer_sure" @click="determine">
              确 定
            </el-button>
          </div>
        </div>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>

<script>
/*
 *
 * 数据说明
 * 传进来的数据
 * checkBoxList 里面item一定有key是id,表示唯一值,label用来展示
 * checkBoxList: [{ id: "1", label: "张三", age: 5 },{ id: "2", label: "李四", age: 6 }] // 表示传进来的列表
 * defaultCheckBoxList:['1', '2', '3'] // 默认选中的值
 * keys: "id" // 表示 表示唯一值字段名称
 *
 * 向父级传值:
 * let obj = {
 *  initList, // 原始数组值
 *  initIsCheckId, // 原始id列表值
 *  isCheckIdList, // 选中的id列表值
 *  isCheckEdItem, // 选中的item列表值
 * };
 * this.$emit("checked", obj); // 把选中的信息抛出
 */

export default {
  data() {
    return {
      input: "",
      state2: "",
      checkAll: false,
      isCheckIdList: [], // 选中的
      isIndeterminate: false,
      checkboxLists: [],
      initList: [], // initList: [{ id: "1", label: "张三11", age: 5 }, { id: "2", label: "李四", age: 6 },],
      initIsCheckId: [], // 初始化id列表
    };
  },
  props: {
    keys: {
      type: String,
      default: "id", // 模拟数据 唯一值 是id
    },
    checkBoxList: {
      type: Array,
      default: [
        // 模拟数据 从父组件传进来的数据格式
        { id: "1", label: "张三", age: 5 },
        { id: "2", label: "李四", age: 6 },
        { id: "3", label: "王五", age: 7 },
        { id: "4", label: "赵六 ", age: 8 },
        { id: "5", label: "小英", age: 9 },
        { id: "6", label: "王麻子", age: 10 },
        { id: "7", label: "王小二", age: 11 },
        { id: "8", label: "老王", age: 12 },
        { id: "9", label: "小李", age: 13 },
      ],
    },
    defaultCheckBoxList: {
      type: Array,
      default: ["3", "4", "5"], // 模拟数据 默认选中的id列表
    },
  },

  mounted() {
    this.init();
  },

  methods: {
    init() {
      let { defaultCheckBoxList = [], checkBoxList = [] } = this;
      this.initList = checkBoxList;
      this.checkboxLists = this.deepClone(checkBoxList); // 深拷贝一下
      if (defaultCheckBoxList.length === 0) return;
      let arr = this.getIdList();
      this.initIsCheckId = this.deepClone(arr);
      this.isCheckIdList = arr;
      this.defaultCheckAllStatus();
      // 默认选中 end
    },

    // 提取id列表
    getIdList() {
      let { defaultCheckBoxList, keys = "id" } = this;
      // 默认选中 start
      let item = defaultCheckBoxList[0];
      let types = Object.prototype.toString.call(item);
      let arr = [];
      // 传的是id字符串
      if (types === "[object String]") arr = defaultCheckBoxList;
      // 传的是数组对象包含id
      if (types === "[object Object]") arr = defaultCheckBoxList.map((x) => x[keys] + "");
      // 传的是id数字
      if (types === "[object Number]") arr = defaultCheckBoxList.map((x) => x + "");
      return arr;
    },

    // 确定
    determine() {
      console.log("isCheckIdList", this.isCheckIdList);
      let { keys, isCheckIdList, checkBoxList, initIsCheckId } = this;
      let isCheckEdItem = checkBoxList.filter((x) => isCheckIdList.includes(x[keys]));
      let initList = this.deepClone(this.initList);
      let obj = {
        initList, // 原始数组值
        initIsCheckId, // 原始id列表值
        isCheckIdList, // 选中的id列表值
        isCheckEdItem, // 选中的itemList值
      };
      console.log("obj", obj);
      this.$emit("checked", obj); // 把选中的信息抛出
    },

    onVisibleChange(v) {
      console.log("是否展示:", v);
      if (!v) {
        // 关闭后
        let initArId = this.initIsCheckId.sort().toString();
        let isCheckIdList = this.isCheckIdList.sort().toString();
        console.log("关闭dropdown,前后选项是否相同:", initArId === isCheckIdList);
        if (initArId === isCheckIdList) return; // 选中的值相同 可不请求
        this.determine();
      }
    },

    // 输入事件
    inputEvent(val = "") {
      val = (val + "").toLowerCase();
      let arr = [];
      if (val === "") {
        // 输入为空 把原始数组赋值
        let ars = this.deepClone(this.initList);
        this.checkboxLists = ars;
      } else {
        // 有输入的内容 提取和输入的内容 匹配列表的label 相关内容
        arr = this.checkboxLists.filter((x) => x.label.includes(val));
        this.checkboxLists = arr;
      }
      this.defaultCheckAllStatus();
    },

    // 默认全选状态
    defaultCheckAllStatus() {
      // 选中的和原始值长度一样 全选
      this.checkAll = this.isCheckIdList.length === this.initList.length;

      // 选中的大于0 并且小于原始数组长度,半选状态
      this.isIndeterminate =
        this.isCheckIdList.length > 0 && this.isCheckIdList.length < this.initList.length;
    },

    // 点击全选
    handleCheckAllChange(val) {
      let { keys, checkboxLists } = this;
      let idList = checkboxLists.map((x) => x[keys]);
      this.isCheckIdList = val ? idList : [];
      this.isIndeterminate = false;
      //
      this.$emit("isCheckEdfn", { isCheckIdList: this.isCheckIdList });
    },

    // 点击 某一项
    handleCheckedChange(value) {
      let checkedCount = value.length;
      this.checkAll = checkedCount === this.checkboxLists.length;
      this.isIndeterminate = checkedCount > 0 && checkedCount < this.checkboxLists.length;
    },

    // 深拷贝
    deepClone(source) {
      if (typeof source !== "object" || source == null) {
        return source;
      }
      const target = Array.isArray(source) ? [] : {};
      for (const key in source) {
        if (Object.prototype.hasOwnProperty.call(source, key)) {
          if (typeof source[key] === "object" && source[key] !== null) {
            target[key] = this.deepClone(source[key]);
          } else {
            target[key] = source[key];
          }
        }
      }
      return target;
    },
  },
};
</script>

<style lang="scss" scoped>
.dropdown {
  cursor: pointer;
}
.drop {
  padding: 10px;
}
.input {
  width: 100px;
  margin: 0 auto;
  width: 100%;
}
.checkAlls {
  margin-top: 5px;
  padding-bottom: 5px;
  display: block;
}
.checkAllLine {
  width: 75%;
  border-bottom: 1px solid #e4e4e4;
  margin: 0 auto;
}
.checkboxLists {
  max-height: 260px;
  padding-right: 10px;
  overflow-y: scroll;
  .checiboxItem {
    margin: 3px 0;
  }
}
.noData {
  margin: 20px 0;
  font-size: 14px;
  color: #ccc;
  width: 100%;
  text-align: center;
}
.footer {
  margin-top: 15px;
  width: 100%;
  text-align: center;
  .footer_sure {
    margin-left: 20px;
  }
}
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

element ui dropdown下拉 复选框+全选+搜索功能 组件 (开箱即食) 的相关文章

随机推荐

  • c语言程序设计答辩时我要说什么,实训答辩的流程开场白

    毕业论文答辩开场白和结束语 各位老师 下午好 我叫 是知 级 班的学生 我的论文题目是 论文是在 导师的悉心指点下完成的 在这里我向我的导师表示深深的谢意 向各位老师不辞辛苦参加我的论文答辩表示衷心的感谢 并对四年来我有机会聆听教诲的各位老
  • [需求管理-6]:需求分析 - 技术可行性研究与方案设计模板

    目录 第1章 技术可行性研究概述 1 1 什么是可行性研究 1 2 什么是技术可行性研究 1 3 技术可行性研究发生的时机和条件 1 4 为什么要做技术可行性研究 1 5 核心概念澄清 1 5 UML与系统架构描述 第2章 技术可行性研究范
  • 为什么ChatGPT的用户体验如此强大

    短短三个月的时间 OpenAI的应 ChatGPT就获得了大量的用户 人气的迅速上升导致一些人预测 ChatGPT 不仅会扰乱搜索引擎 还会扰乱电子学习 写作和编辑等领域 该软件不仅是一个有趣的聊天机器人 您可以与之进行有趣的对话 而且还是
  • C# PDF添加骑缝章

    许多比较重要的文件比如合同等都有多页 在签订合同时 为了防止造假或更换页面 我们通常会选择给合同文件加盖骑缝章 这篇文章将介绍如何使用 NET PDF组件Spire PDF for NET在C 应用程序中实现给PDF合同文件加盖骑缝章 引用
  • 阿里云大数据ACP认证学习笔记

    阿里云大数据ACP认证学习笔记 1 大数据基础 2 大数据计算服务Maxcompute 2 1基础知识 2 1 1购买Maxcompute并创建项目增加子用户 2 1 2创建ODPS 2 1 3maxcompute的命令行客户端odpscm
  • 优化命令之sar——最牛命令

    目录 一 sar命令概述 1 1sar概述 1 2sar常用选项 1 3常用参数 二 CPU资源监控 2 1整体CPU使用统计 u 2 2各个CPU使用统计 P 2 3将CPU使用情况保存到文件中 三 内存监控 3 1内存和交换空间监控 3
  • 云计算相关---初探

    SAE Sina App Engine Sina App Engine SAE 是由新浪公司开发和运营的开放云计算平台的核心组成部分 SAE的目标是实现互联网应用在开发运维上的无缝整合 为App开发者提供稳定 快捷 透明 可控的服务化的平台
  • GBase 8c 使用之执行SQL语句

    应用程序通过执行SQL语句来操作数据库的数据 不用传递参数的语句 需要按以下步骤执行 1 调用Connection的createStatement方法创建语句对象 Connection conn DriverManager getConne
  • 跨站请求伪造CSRF防护方法

    CSRF Cross site request forgery跨站请求伪造 也被称成为 one click attack 或者session riding 通常缩写为CSRF或者XSRF 是一种对网站的恶意利用 AD 51CTO 网 第十二
  • 图的深度优先遍历和广度优先遍历算法流程图

    图的存储结构 邻接表表示方法 适用于有向图和无向图 图的遍历 从图的某顶点出发 访问图中所有顶点 并且每个顶点仅访问一次 图中可能有回路 遍历可能沿回路又回到已遍历过的结点 为避免同一顶点被多次访问 必须为每个被访问的顶点作一标志 为此引入
  • 辐射发射测试软件,辐射发射(Radiated Emission)测试方法详解

    辐射发射 Radiated Emission 测试 是测量EUT通过空间传播的辐射骚扰场强 可以分为磁场辐射 电场辐射 前者针对灯具和电磁炉 后者则应用普遍 另外 家电和电动工具 AV产品的辅助设备有功率辐射的要求 称为骚扰功率 1 测试标
  • 质量管理五大工具七大方法、质量控制之系列文章

    目录 五大工具 APQP FMEA MSA PPAP SPC 七大手法 检查表 层别法 柏拉图 因果图 散布图 直方图 控制图 现场抽样法 工具 质量管理五五大工具七大方法工具 质量管理五 NO 32 原创 管理工具距离我们有多远 NO 1
  • 颠倒字节数组

    public static void main String args byte a 10 0 80 68 53 for int i 0 i
  • 数据结构小白之斐波那契查找

    1 斐波那契数列的简单介绍 摘自百度 斐波那契数列 Fibonacci sequence 又称黄金分割数列 因数学家列昂纳多 斐波那契 Leonardoda Fibonacci 以兔子繁殖为例子而引入 故又称为 兔子数列 指的是这样一个数列
  • java 时区错乱,设置了时区的SimpleDateFormat获取正确的值,但时区错误

    我在Spring应用程序中进行了一个简单的测试 该应用程序的默认时区设置为UTC SpringBootApplication public class MemberIntegrationApp Autowired private TimeZ
  • redis HyperLogLog,看这篇就够了

    文章目录 前言 一 动手试试 1 添加 2 统计 3 合并 二 原理 1 伯努利过程 2 HyperLogLog 2 1 工作原理 2 2 占用内存大小 2 3 内存优化 3 数据编码 3 1 稀疏编码 3 2 密集编码 3 3 转码 前言
  • WebAssebmly初级——调试C++代码(三)

    系列文章目录 WebAssebmly初级 文章目录 系列文章目录 前言 一 安装扩展程序 二 使用 1 生成 2 开启调试 前言 对于一个研发来说 写代码可以在许多编译器上编写 编译器体验感对于写代码来说可以是相当重要 可是更影响程序员体验
  • 经典兔子问题java解决

    经典兔子问题 题目 古典问题 有一对兔子 从出生后第 3 个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不死 问每个月的兔子总数为多少 解题思路 我们可以观察到第一个月1对兔子 第二个月1对兔子 第三个月2对兔
  • 基于遗传算法求解旅行商问题

    基于遗传算法求解旅行商问题 旅行商问题 Traveling Salesman Problem 简称TSP 是一个经典的组合优化问题 其目标是找到一条最短路径 使得一个旅行商可以经过所有给定的城市并回到起始城市 同时每个城市只能经过一次 由于
  • element ui dropdown下拉 复选框+全选+搜索功能 组件 (开箱即食)

    element ui dropdown下拉 复选框 全选 搜索功能 组件 开箱即食 可以传入默认值默认选中 可以全选 可以搜索 点击确定把选中的值传给父级 开箱即食