vue2里的el-select实现全选/取消全选/反选功能

项目场景:

el-select组件拥有优秀的单选,多选功能,这在大部分业务中都能满足我们的需要,但是有这么一种场景却没法满足:’数据太多,我想一键全选怎么做?我想反选怎么做?如何取消全选?


解决方案

答案当然是可以的,我们可以在原有基础上,构建一个符合我们业务需要的el-select组件。一般的option列表都是后端返回的,我们可以与后端相约好,多加一条 ’全选‘来辅助实现,但老师告诉我们,凡事还是靠自己比较好,我们拿到后端返回的数据列表后,我们往里面追加一条 ’全选‘数据,比如像下面:

axios.get(url).then(res => {
	if(res.data.code === 200){
		this.options= res.data.hospitalList
		const all_checked = { 
              hospital_id:'all',
              hospital_name:'全部医院',
         }
         //追加到第一个位置上
         this.options.unshift(all_checked)
	}
})

渲染后的效果如下:
在这里插入图片描述

文字描述过多可以直接看下面代码。接下来我们需要进行全选/取消全选/反选操作,如果要全选,我们得知道用户是否点击了 全选医院 ,可以通过当前选中数组里是否包含 all,并且记录上一次选中的数组中不能包含 all来判断是否全选,反之就是取消全选。 因为el-select多选的时候,是不知道你此时具体选中了哪个,它返回的是一个数组,用数组最后一位来判断是否选中哪个,只适用用选中的时候,反选就不行,所以我们可以通过当前最新选中的数组,和记录上次选中的数组进行比较,遍历当前最新数组每一个,然后判断上次的数组是否存在这个数据,如果没有存在说明是当前操作的数据,并把结果返回给v-model绑定的数据就实现了反选。 最后一个操作就是 一个一个选中,如果选中完默认就是全选,可以先把 我们一开始push进去的all先取出来,然后进行比较长度,相等就是全选。

 changeHospital(val) {
    // 判断是否 全选
     // 如果当前选中的数组没有 all , 上一个记录的数组有 all,说明是取消全选操作,反之全选
      if(this.preList.includes('all') && !latestList.includes('all')){
        //取消全选 
         console.log('cancel checked');
        this.curList = [this.options[1].hospital_id] //取消全选 清空数据,默认勾选第一个数据

      }else if(!this.preList.includes('all') && latestList.includes('all')){
          //全选
          console.log('checked all');
          this.curList = this.options.map(item => item.hospital_id) //选中全部id

       }else{
       	 //说明当前是全选状态,用户点击某条数据,需要进行反选
            if(latestList.includes('all')){
               //反选
               console.log('reverse checked');
               //获取这条数据
               this.curList = [this.getCurCheckedTarget(this.preList,latestList)]
               this.preList = this.curList //反选都是一个 直接赋值就行
               return
            }

             // 判断前,需要先把 all 删除
             let temp = [...this.options]
             temp.splice(0,1)

              if(latestList.length === temp.length){ //单个全勾选后,就是全选
                 console.log('re-checked all');
                 this.curList.unshift('all')
               }

       }
       //记录上一次的操作
         this.preList = [...latestList]
  },


 // 主要用于反选的时候,精确查找到某条数据
  getCurCheckedTarget(preList,latestList){
     // 如果包含 all 说明是全选,需要把全部的数据赋值给他
     let source = preList.includes('all') ? [...this.options.map(item => item.hospital_id)] : [...preList]
     let target = [...latestList]
      //遍历查找 
      while (source.length !== 0) {
             let cur = source.shift()
             if(!target.includes(cur)){
                 return cur
              }
       }
  }

最终实现了 全选、取消全选、反选、全部选中即为全选的操作。

请添加图片描述
还有一种方法获取点击某个元素,给el-select绑定 visible-chang事件,当触发的时候,给下拉框的元素绑定事件,不需要每个都绑定,只给父元素绑定就行,比如事件委托,然后就知道点击的哪个了,具体可以自己试试哦

留个小问题,如果数据过多,下拉框一下子渲染出来,页面加载太慢怎么办?是否可以整个类似分页加载数据的效果呢?

自己写的不一定对或者最优,有更好的方案或问题 欢迎提出~

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue.js是一种流行的JavaScript框架,用于构建界面。它采用了组件化的开发方式,使得开发者可以将页面拆分成多个独立的组件,每个组件都有自己的逻辑和样式。Vue.js具有简单易学、灵活高效的特点,因此在前端开发中得到了广泛应用。 在Vue.js中,el-select是一个下拉选择框组件,可以用于实现单选或多选功能。要实现el-select的多选加全选功能,可以通过以下步骤进行: 1. 在Vue组件中引入el-select组件,并设置multiple属性为true,表示启用多选功能。 2. 使用v-model指令绑定一个数组类型的数据,用于存储用户选择的选项。 3. 添加一个全选选项,并使用v-model指令将其与一个布尔类型的数据进行绑定。 4. 监听全选选项的变化,当全选选项被选中时,将所有选项添加到已选择的选项数组中;当全选选项取消选中时,清空已选择的选项数组。 下面是一个示例代码,演示了如何实现el-select的多选加全选功能: ```html <template> <div> <el-select v-model="selectedOptions" multiple> <el-option v-for="option in options" :key="option.value" :label="option.label" :value="option.value"></el-option> </el-select> <el-checkbox v-model="selectAll">全选</el-checkbox> </div> </template> <script> export default { data() { return { options: [ { label: '选项1', value: 'option1' }, { label: '选项2', value: 'option2' }, { label: '选项3', value: 'option3' }, // 其他选项... ], selectedOptions: [], selectAll: false }; }, watch: { selectAll(value) { if (value) { this.selectedOptions = this.options.map(option => option.value); } else { this.selectedOptions = []; } } } }; </script> ``` 在上述代码中,options数组存储了所有的选项,selectedOptions数组存储了用户选择的选项,selectAll变量表示全选选项的状态。通过监听selectAll的变化,可以实现全选功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值