〇、前言

在 Element 中,Select 组件支持单选和多选,但是并没有全选的属性,因此只能通过其事件和属性来实现,本文将实现一个简单的示例。

注意:本文的示例中,通过 leixing1 来兼容多控件共享同一方法。

一、两种实现

1.1 通过添加一个 Checkbox 来操作全选(推荐)

  • 大致思路

在全部选项最上边添加一个 Checkbox 复选框,勾选时自动全选,取消勾选自动取消全部已选中项。

再给 Select 添加一个 Change 事件方法,当选中项等于备选列表长度,则自动勾选 Checkbox,否则取消勾选。

  • 实现效果

  • 前端实现代码
<el-select
class="select-item uniform-width"
v-model="formData.leixing1"
filterable multiple
clearable @change="changeSelect($event,'leixing1')"
placeholder="全部类型(多选)"
>
<el-checkbox :indeterminate="isIndeterminate_lx" v-model="checked" @change="selectAll('leixing1')" style="padding:5px 0 10px 20px;">全选</el-checkbox>
<el-option
v-for="item in leixing1OptionsList"
:label="item.mingcheng"
:value="item.bianma"
:key="item.bianma"
/>
</el-select>
  • js 代码实现
<script>
export default {
name: "Example",
data() {
return {
isIndeterminate:false,
isIndeterminate_lx1:false,
isIndeterminate_lx2:false,
checked:false,
checked_lx1:false,
checked_lx2:false,
formData:[],
leixing1OptionsList:[
{mingcheng:"第1项",bianma:"1"},
{mingcheng:"第2项",bianma:"2"},
{mingcheng:"第3项",bianma:"3"},
],
leixing2OptionsList:[],
};
},
methods: {
changeSelect(val,leixing) {
let list=[]
let value=""
switch (leixing){ // 根据不同的组件对取值进行区分
case "leixing1":
list=this.leixing1OptionsList
this.checked=this.checked_lx1
break
case "leixing2":
list=this.leixing2OptionsList
this.checked=this.checked_lx2
break
}
if (this.formData[leixing].length==list.length) { // 全选
this.checked=true
this.isIndeterminate=false
} else if (this.formData[leixing].length!=list.length && this.formData[leixing].length>0) {
this.checked=false
this.isIndeterminate=true
}else if(this.formData[leixing].length==0){
this.isIndeterminate=false
}
switch (leixing){
case "leixing1":
this.checked_lx1=this.checked
this.isIndeterminate_lx1=this.isIndeterminate
break
case "leixing2":
this.checked_lx2=this.checked
this.isIndeterminate_lx2=this.isIndeterminate
break
}
},
selectAll(leixing) {
let list=[]
let value=""
switch (leixing){ // 根据不同的组件对取值进行区分
case "leixing1":
list=this.leixing1OptionsList
this.checked=this.checked_lx1
this.isIndeterminate_lx1=false
value="bianma" // 具体的取值属性配置
break
case "leixing2":
list=this.leixing2OptionsList
this.checked=this.checked_lx2
this.isIndeterminate_lx2=false
value="key" // 具体的取值属性配置
break
}
if (this.checked) { // 全选
list.map((item) => {
this.formData[leixing].push(item[value])
})
} else { // 取消全选
this.formData[leixing] = [];
}
},
},
};
</script>

1.2 通过增加一个 Option 选项‘全选’来实现

  • 大致思路

手动增加 Select 的第一个选项‘全选’,通过这个选项的事件,来操作是否全选。

再通过列表的长度和已选中的选项进行比较,相等就自动勾选‘全选’,否则就取消勾选。

注意:Select 组件的值会包含‘全选’这个值,需要在后端进行过滤。

  • 实现效果

  • 前端控件代码
<el-select
class="select-item uniform-width"
v-model="formData.leixing1"
filterable multiple
clearable @change="changeSelect($event,'leixing1')"
placeholder="全部类型(多选)"
>
<el-option label='全选' value='全选' @click.native="selectAll('leixing1')" v-if="leixing1OptionsList.length"></el-option>
<el-option
v-for="item in leixing1OptionsList"
:label="item.mingcheng"
:value="item.bianma"
:key="item.bianma"
/>
</el-select>
  • js 代码实现及解释
<script>
export default {
name: "Example",
data() {
return {
formData:[],
leixing1OptionsList:[
{mingcheng:"第1项",bianma:"1"},
{mingcheng:"第2项",bianma:"2"},
{mingcheng:"第3项",bianma:"3"},
],
leixing2OptionsList:[],
};
},
methods: {
changeSelect(val,leixing) {
let list=[]
let value=""
switch (leixing){ // 根据不同的组件对取值进行区分
case "leixing1":
list=this.leixing1OptionsList
break
case "leixing2":
list=this.leixing2OptionsList
break
}
if (!val.includes('全选') && val.length === list.length) { // 手动选择全部选项后,自动选中‘全选’
this.formData[leixing].unshift('全选')
} else if (val.includes('全选') && (val.length - 1) < list.length) { // 取消选中任一项,同时取消‘全选’
this.formData[leixing] = this.formData[leixing].filter((item) => { return item !== '全选'})
}
},
selectAll(leixing) {
let list=[]
let value=""
switch (leixing){ // 根据不同的组件对取值进行区分
case "leixing1":
list=this.leixing1OptionsList
value="bianma" // 具体的取值属性配置
break
case "leixing2":
list=this.leixing2OptionsList
value="key" // 具体的取值属性配置
break
}
if (this.formData[leixing]!=undefined && this.formData[leixing].length < list.length) { // 全选
this.formData[leixing] = ['全选'] // 默认选中‘全选’这一项
list.map((item) => { // 将全部选项加入值列表
this.formData[leixing].push(item[value])
})
} else { // 取消全选
this.formData[leixing] = [];
}
},
},
};
</script>

Select 组件实现【全选】(基于 Element)的更多相关文章

  1. element-ui组件,全选树节点,新增数据子节点数据,出现回填问题

    案情分析:全选后父节点被选中保存,在这个树节点下新增数据时,就会出现,也被选中,事实上数据是没有被选中,也就意味着权限未被配置,而显示是已经配置了,显然这个是一个bug 1.处理前,直接用下面的方法很 ...

  2. react-native IOS TextInput长按提示显示为中文(select | selectall -> 选择 | 全选)

    根据手机系统语言(简体中文/英文),提示不同的长按效果 长按提示效果图 英文长按提示 中文长按提示 解决 1.手机系统语言为简体中文: 设置->通用->语言与地区 2.ios/项目/inf ...

  3. 关于Element UI中select组件中遇到的问题

    问题一:在使用select组件设置多选功能后,窗口抖动问题? 详细描述:在我使用select做多选的功能时出现了窗口抖动的问题,测试的时候发现,在有些人的电脑上抖动,有些人的电脑上不抖,找了很多文档, ...

  4. JS实战 · 复选框全选操作

    思路: 1.获取被选中checkbox,通过checked属性的状态完成: 2.获取被选中的checkbox的value值: 3.求所有value的和sum: 4.定义span区域存储和sum:   ...

  5. js复选框全选反选

    本篇文章是关于复选框的,有2种形式:1.全选.反选由2个按钮实现:2.全选.反选由一个按钮实现. <!DOCTYPE html> <html> <head> < ...

  6. jQuery_完成复选框的全选与全不选

    别的不多说,直接上代码,用于完成复选框的全选与全不选. <!DOCTYPE html> <html> <head> <meta charset="U ...

  7. element-ui select组件中复选时以字符串形式显示

    我使用的element-ui的版本是1.4.13. 如上图所示,使用el-select组件,要实现可搜索.可复选.可创建条目时,展示样式是如上图所示,输入框的高度会撑开,影响页面布局,按照产品的需求, ...

  8. vue结合element-ui 的select 全选问题

    下拉列表多选 问题 通过操作 所有来进行全选 全不选问题 element-ui 中 select 记录下自己最近使用element-ui 中的 select多选问题 在element中默认是指单纯多选 ...

  9. krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦

    博客地址:https://ainyi.com/81 基于 element ui 的==升级版穿梭框组件==发布到 npm 啦 看过我之前博客的同学或许知道我之前写过关于 element 穿梭框组件重构 ...

  10. 用javascript实现全选/反选组件

    以下是本人制作的全选/反选 组件,供广大同行参考.指正: 效果如图: 在实现的过程中,全选和全部取消选中这两个功能较为简单,只需用for循环遍历所有复选框为true或false即可.反选也较为简单,也 ...

随机推荐

  1. docker Get "https://registry-1.docker.io/v2/": x509: certificate is valid for

    前言 docker 在进行 build 时,报错:Get "https://registry-1.docker.io/v2/": x509: certificate is vali ...

  2. Top 出海 AI 公司招技术!HIX.AI & Pollo.ai | 深圳

    HIX.AI & Pollo.ai 招聘高级海外 AI 产品经理 (25-45K) 岗位职责: 负责Web 端海外 AI 产品的规划与策划,负责产品需求分析及原型设计,并制定方案推动产品研发落 ...

  3. 【SpringMVC】表单标签 & 处理静态资源

    SpringMVC 表单标签 &处理静态资源 使用 Spring 的表单标签 • 通过 SpringMVC 的表单标签可以实现将模型数据中的属性和 HTML 表单元素相绑定,以实现表单数据更便 ...

  4. 《机器人SLAM导航核心技术与实战》第1季:第3章_OpenCV图像处理

    <机器人SLAM导航核心技术与实战>第1季:第3章_OpenCV图像处理 视频讲解 [第1季]3.第3章_OpenCV图像处理-视频讲解 [第1季]3.1.第3章_OpenCV图像处理_认 ...

  5. TDXSpreadSheet中自定义公式函数三大步骤

    看其demo:CustomFunctionDemo. 在报表系统中,特别是财务等报表系统中.需要对固定格式的报表中cell定义取数公式. 如新中大中: 公式 返回值 gs_dwmc(预算单位代码/名称 ...

  6. cnpack导致view快捷键失灵。

    学习d10.3.出现怪问题: 卸载cnpack出现: 这下要用快捷键了.那可不烦透了. 如此就ok了. 鸡蛋好吃,还要知道母鸡如何生蛋的?

  7. 康谋分享 | 确保AD/ADAS系统的安全:避免数据泛滥的关键!

    为确保AD/ADAS系统的安全性,各大车企通常需要收集.处理和分析来自于摄像头.激光雷达等传感器的数据,以找出提高系统安全性和性能的方法.然而在数据收集过程中,不可避免地会出现大量无价值数据,造成数据 ...

  8. 机器人操作系统ROS2之安装(Ubuntu 24)

    根据官网说明,ROS2是支持MAC的,本来打算在手头的MAC 15.3.2装一个,虽然要自己编译ROS2系统,但是想着比虚拟机性能好,就兴冲冲的开始了,也没在意官网提示尽量还是装安装版.最后折腾了几天 ...

  9. MySQL 中的回表是什么?

    MySQL 中的回表 回表是 MySQL 查询优化中的一个概念,指的是在使用非聚簇索引查询时,无法直接从索引中获取所需的所有数据,需要通过非聚簇索引查找到主键值,然后再去聚簇索引中根据主键值获取完整数 ...

  10. Spring 中@Autowired,@Resource,@Inject 注解实现原理

    使用案例 前置条件: 现在有一个 Vehicle 接口,它有两个实现类 Bus 和 Car ,现在还有一个类 VehicleService 需要注入一个 Vehicle 类型的 Bean: publi ...