ElementPlus 之 el-select 多选实现全选功能

简介: 本文介绍了在ElementPlus框架中,如何通过自定义事件处理和条件判断实现`el-select`多选控件的全选功能。

前言

经常会遇到这种多选下拉框支持全选的需求,在此简单记录一下在 ElementPlus 框架下,如何使得多选的 el-select 控件支持实现全选功能。

一、示例代码

(1)/src/views/Example/ElSelect/index.vue

<template>
  <div class="index">
    <el-select
      size="small"
      placeholder="请选择游戏"
      value-key="id"
      style="width: 100%"
      multiple
      filterable
      clearable
      collapse-tags
      :reserve-keyword="false"
      collapse-tags-tooltip
      v-model="gameParam.gameSelectedList"
      @remove-tag="handleGameItemRemove"
    >
      <el-option
        v-for="item in gameParam.gameList"
        :key="item.id"
        :label="item.name"
        :title="item.name"
        :value="item"
        @click="handleGameItemClick(item)"
      >
      </el-option>
    </el-select>
  </div>
</template>

<script setup>
import {
    
     h, onMounted, onUnmounted, ref, getCurrentInstance, reactive, watch, nextTick } from 'vue'

// 代理对象
const {
    
     proxy } = getCurrentInstance()

// 游戏参数
const gameParam = reactive({
    
    
  // 选中的游戏对象列表
  gameSelectedList: [],

  // 游戏列表
  gameList: [
    {
    
     'id': 0, 'name': '全选' },
    {
    
     'id': 1, 'name': '梦幻西游' },
    {
    
     'id': 2, 'name': '暗黑破坏神2' },
    {
    
     'id': 3, 'name': '国家崛起2' },
    {
    
     'id': 4, 'name': '侠盗猎车手圣安地列斯' },
    {
    
     'id': 5, 'name': '月影传说' },
    {
    
     'id': 6, 'name': '地下城守护者2' },
  ],
})

/**
 * 游戏改变事件句柄方法
 */
const handleGameItemClick = (item) => {
    
    
  console.log('item =>', item)

  // 当点击“全选”选项时
  if (item.name == '全选') {
    
    
    // 判断“已选列表”是否包含“全选”
    let isContain = false
    for (let vo of gameParam.gameSelectedList) {
    
    
      if (vo.name == item.name) {
    
    
        isContain = true
      }
    }
    console.log('isContain =>', isContain)

    if (isContain) {
    
    
      // 若包含“全选”,则全部选中
      gameParam.gameSelectedList = gameParam.gameList
    } else {
    
    
      // 若不包含“全选”,则全部不选中
      gameParam.gameSelectedList = []
    }
  }
  // 当点击其它选项时
  else {
    
    
    // 判断“已选列表”是否包含“全选”
    const index = gameParam.gameSelectedList.findIndex(
      (item) => item.name === '全选'
    )
    if (index != -1) {
    
    
      console.log(gameParam.gameSelectedList.length)
      console.log(gameParam.gameList.length)
      if ((gameParam.gameSelectedList.length + 1) <= gameParam.gameList.length) {
    
    
        gameParam.gameSelectedList.splice(index, 1)
      }
    } else {
    
    
      console.log(gameParam.gameSelectedList.length)
      console.log(gameParam.gameList.length)
      if ((gameParam.gameSelectedList.length + 1) == gameParam.gameList.length) {
    
    
        gameParam.gameSelectedList.push(
          {
    
    
            'id': 0,
            'name': '全选'
          }
        )
      }
    }
  }
}

/**
 * 单个移除标签
 */
const handleGameItemRemove = (item) => {
    
    
  console.log('item =>', item)

  // 当点击“全选”选项时
  if (item.name == '全选') {
    
    
    // 判断“已选列表”是否包含“全选”
    let isContain = false
    for (let vo of gameParam.gameSelectedList) {
    
    
      if (vo.name == item.name) {
    
    
        isContain = true
      }
    }
    console.log('isContain =>', isContain)

    if (isContain) {
    
    
      // 若包含“全选”,则全部选中
      gameParam.gameSelectedList = gameParam.gameList
    } else {
    
    
      // 若不包含“全选”,则全部不选中
      gameParam.gameSelectedList = []
    }
  }
  // 当点击其它选项时
  else {
    
    
    // 判断“已选列表”是否包含“全选”
    const index = gameParam.gameSelectedList.findIndex(
      (item) => item.name === '全选'
    )
    if (index != -1) {
    
    
      console.log(gameParam.gameSelectedList.length)
      console.log(gameParam.gameList.length)
      if ((gameParam.gameSelectedList.length + 1) <= gameParam.gameList.length) {
    
    
        gameParam.gameSelectedList.splice(index, 1)
      }
    } else {
    
    
      console.log(gameParam.gameSelectedList.length)
      console.log(gameParam.gameList.length)
      if ((gameParam.gameSelectedList.length + 1) == gameParam.gameList.length) {
    
    
        console.log(1111)
        gameParam.gameSelectedList.push(
          {
    
    
            'id': 0,
            'name': '全选'
          }
        )
      }
    }
  }
}
</script>

<style lang="less" scoped>
.index {
    
    
  width: auto;
  height: 100%;
  padding: 0 100px;
  display: grid;
  align-items: center;
  text-align: center;
  background-color: #fafafa;
}
</style>

二、运行效果

目录
相关文章
ECharts 柱状图横轴(X轴)文字内容显示不全
ECharts 柱状图横轴(X轴)文字内容显示不全
2815 0
Element el-select 选择器(下拉框)详解
本文目录 1. 用途 2. 数据绑定 2.1 固定选项 2.2 选项绑定数组 3. 功能效果 3.1 可清空选项 3.2 多选 3.3 可搜索 4. 事件响应 5. 小结
8006 0
Element el-select 选择器(下拉框)详解
|
关系型数据库 MySQL 数据库
Element el-date-picker 日期选择器详解
本文目录 1. 前言 2. 基本用法 3. 日期格式化 4. 选择其他日期单位 5. 选择多个日期 6. 带快捷选项 7. 禁用部分日期 8. 小结
7149 0
Element el-date-picker 日期选择器详解
|
前端开发 JavaScript 开发者
利用 el-select 和 el-tree 实现树形结构多选框联动功能
本文详细介绍了如何使用ElementUI中的el-select下拉选择器和el-tree树形控件来实现多功能联动选择器,包括多选、删除、搜索、清空选项等功能。通过树形控件展示复杂的层级结构,用户可以通过下拉选择树形节点,实时搜索节点,且支持批量选择和删除功能。文中提供了完整的HTML、JavaScript和CSS代码实现,帮助开发者快速集成此功能。
6612 0
利用 el-select 和 el-tree 实现树形结构多选框联动功能
echarts如何设置滚动条(dataZoom),实现横向或纵向滚动
echarts如何设置滚动条(dataZoom),实现横向或纵向滚动
echarts如何设置滚动条(dataZoom),实现横向或纵向滚动
|
JavaScript
elementUI/Plus 输入框按回车刷新页面分析与解决
elementUI/Plus 输入框按回车刷新页面分析与解决
elementUI/Plus 输入框按回车刷新页面分析与解决
|
JavaScript API 索引
js中的reduce()方法 讲解 和实现
`reduce()` 方法对数组元素依次应用一个回调函数,将结果累计并最终返回单一值。语法为 `reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)`。参数包括累计器(初次为初始值或首元素)、当前元素值、索引及数组自身。此方法需返回值供下一轮迭代使用。常见应用场景包括计算数组总和与平均值、统计元素频率、过滤与转换数组内容及去除重复项等。例如,可通过 `reduce()` 快速计算 `[1, 2, 3, 4, 5]` 的总和或对对象属性值求和。此外,还可自定义实现 `reduce()` 方法
7650 1
|
前端开发 JavaScript
vue+el-select下拉多选实现,全选,反选,清空功能源码
vue+el-select下拉多选实现,全选,反选,清空功能源码
1152 0
element UI实现输入建议下拉列表 —— el-select filterable可筛选的下拉列表 or 带输入建议的输入框 el-autocomplete ?
element UI实现输入建议下拉列表 —— el-select filterable可筛选的下拉列表 or 带输入建议的输入框 el-autocomplete ?
1075 0