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>

二、运行效果

目录
相关文章
Element el-select 选择器(下拉框)详解
本文目录 1. 用途 2. 数据绑定 2.1 固定选项 2.2 选项绑定数组 3. 功能效果 3.1 可清空选项 3.2 多选 3.3 可搜索 4. 事件响应 5. 小结
7125 0
Element el-select 选择器(下拉框)详解
|
JavaScript 前端开发
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
3504 0
vue 部署项目,访问页面空白,找不到js或css文件 (net::ERR_ABORTED 404 (Not Found))
|
数据格式
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
本文介绍了在ElementUI和ElementPlus中使用`el-table`组件实现合并行功能的技巧,包括多列合并和单列合并的方法,并提供了相应的示例代码和运行效果。
9162 1
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
|
前端开发 JavaScript
vue+el-select下拉多选实现,全选,反选,清空功能源码
vue+el-select下拉多选实现,全选,反选,清空功能源码
637 0
|
12月前
|
前端开发 JavaScript 开发者
利用 el-select 和 el-tree 实现树形结构多选框联动功能
本文详细介绍了如何使用ElementUI中的el-select下拉选择器和el-tree树形控件来实现多功能联动选择器,包括多选、删除、搜索、清空选项等功能。通过树形控件展示复杂的层级结构,用户可以通过下拉选择树形节点,实时搜索节点,且支持批量选择和删除功能。文中提供了完整的HTML、JavaScript和CSS代码实现,帮助开发者快速集成此功能。
3962 0
利用 el-select 和 el-tree 实现树形结构多选框联动功能
Element UI【实战范例】下拉选择 el-select 的 change 事件传入选中值+自定义参数
Element UI【实战范例】下拉选择 el-select 的 change 事件传入选中值+自定义参数
2843 1
element plus表格的表头和内容居中
element plus表格的表头和内容居中
833 0
Element - ui :el-input 输入只能是数字并且小数点后只能是1-2位
Element - ui :el-input 输入只能是数字并且小数点后只能是1-2位
4899 1
|
JSON JavaScript 前端开发
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
1595 0
VUE element-ui之table表格前端自动过滤(筛选),不调用数据接口筛选表格,方法
|
JavaScript
解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题
解决Vue 3 + Element Plus树形表格全选多选以及子节点勾选的问题