Select 组件实现【全选】(基于 Element)
〇、前言
在 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)的更多相关文章
- element-ui组件,全选树节点,新增数据子节点数据,出现回填问题
案情分析:全选后父节点被选中保存,在这个树节点下新增数据时,就会出现,也被选中,事实上数据是没有被选中,也就意味着权限未被配置,而显示是已经配置了,显然这个是一个bug 1.处理前,直接用下面的方法很 ...
- react-native IOS TextInput长按提示显示为中文(select | selectall -> 选择 | 全选)
根据手机系统语言(简体中文/英文),提示不同的长按效果 长按提示效果图 英文长按提示 中文长按提示 解决 1.手机系统语言为简体中文: 设置->通用->语言与地区 2.ios/项目/inf ...
- 关于Element UI中select组件中遇到的问题
问题一:在使用select组件设置多选功能后,窗口抖动问题? 详细描述:在我使用select做多选的功能时出现了窗口抖动的问题,测试的时候发现,在有些人的电脑上抖动,有些人的电脑上不抖,找了很多文档, ...
- JS实战 · 复选框全选操作
思路: 1.获取被选中checkbox,通过checked属性的状态完成: 2.获取被选中的checkbox的value值: 3.求所有value的和sum: 4.定义span区域存储和sum: ...
- js复选框全选反选
本篇文章是关于复选框的,有2种形式:1.全选.反选由2个按钮实现:2.全选.反选由一个按钮实现. <!DOCTYPE html> <html> <head> < ...
- jQuery_完成复选框的全选与全不选
别的不多说,直接上代码,用于完成复选框的全选与全不选. <!DOCTYPE html> <html> <head> <meta charset="U ...
- element-ui select组件中复选时以字符串形式显示
我使用的element-ui的版本是1.4.13. 如上图所示,使用el-select组件,要实现可搜索.可复选.可创建条目时,展示样式是如上图所示,输入框的高度会撑开,影响页面布局,按照产品的需求, ...
- vue结合element-ui 的select 全选问题
下拉列表多选 问题 通过操作 所有来进行全选 全不选问题 element-ui 中 select 记录下自己最近使用element-ui 中的 select多选问题 在element中默认是指单纯多选 ...
- krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦
博客地址:https://ainyi.com/81 基于 element ui 的==升级版穿梭框组件==发布到 npm 啦 看过我之前博客的同学或许知道我之前写过关于 element 穿梭框组件重构 ...
- 用javascript实现全选/反选组件
以下是本人制作的全选/反选 组件,供广大同行参考.指正: 效果如图: 在实现的过程中,全选和全部取消选中这两个功能较为简单,只需用for循环遍历所有复选框为true或false即可.反选也较为简单,也 ...
随机推荐
- windows本地认证
windows本地认证 本地认证概述 本地认证最简单的例子就是我们的电脑上存储着自己的账号密码,无论电脑是否联网,只要能开机,就可以输入账号密码登录到电脑中,工作组就是采用本地认证. 那认证流程是什么 ...
- 获取当前电脑屏幕的dpi
<div id="test" style="width:1in;height:1in;overflow:hidden;"></div> ...
- 130道基础OJ编程题之: 89~107
130道基础OJ编程题之: 89~107 @ 目录 130道基础OJ编程题之: 89~107 89. BC101 班级成绩输入输出 99. BC102 矩阵元素定位 100. BC103 序列重组矩阵 ...
- 如何在 Git 书写良好的 Commit Messages
如何在 Git 书写良好的 Commit Messages Why(为什么编写) | How(如何编写) Why A diff will tell you what changed, but only ...
- 【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉”
[电脑]解决DiskGenius调整分区大小时报错"文件使用的簇被标记为空闲或与其它文件有交叉" 零.报错 在使用DiskGenius对磁盘分区进行调整时,DiskGenius检查 ...
- 3D Gaussian 三维视觉重建
论文资料 论文 https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_low.pdf 资料网站 ...
- Kubernetes基础教程-通过部署Nginx快速学习基本使用命令
1.验证节点信息 1.1.查看控制平面组件的状态 [root@linux-servertwo software]# kubectl get cs Warning: v1 ComponentStatus ...
- harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
大家好!我是黑臂麒麟,一位6年的前端: if you're change the world, you're workingon important things. you're excited to ...
- MySQL隐藏手机号
1.实现方法 通过MySQL的left.right.contact函数实现 2.语法说明 contact()函数 作用:将多个字符串连接成一个字符串 语法:concat(字符串1,....,字符串n) ...
- px转rem适配方案之postcss-pxtorem
一.安装 npm install postcss-pxtorem --save-dev 二.增加postcss.config.js文件 在目录文件下增加postcss.config.js并添加相关配置 ...