首页 > 其他分享 >Element-ui中 选择器(select)多选下拉框实现全选功能

Element-ui中 选择器(select)多选下拉框实现全选功能

时间:2023-06-01 14:47:17浏览次数:47  
标签:selectedArr default 选择器 length 全选 selectOptions type 下拉框

Element-ui中 选择器(select)多选下拉框实现全选功能

需求(产品整活):
需要下拉时候可以一键全选

父组件运用

<template>
  <div>
    <MultipleSelect
      :filterable="false"
      :selectOptions="selectOptions" //数据集合
      :mulSelectLoading="mulSelectLoading" //是否显示loading
      :mulSelecteds="mulSelecteds"// 绑定的值
      labels="schoolName" //自定义label参数
      values="unitId"  //自定义value参数
      @update:updateMultipleSelect="val => mulSelecteds = val">
    </MultipleSelect>
  </div>
</template>
 
<script>
import MultipleSelect from './MultipleSelect.vue';
export default {
  data() { 
    return {
      selectOptions:[],
      mulSelectLoading:false,
      mulSelecteds:[]
    } 
  }, 
  components:{
    MultipleSelect,
  },
  methods: {
    mockData(){
      this.mulSelectLoading = true;
      // 模拟数据
      setTimeout(()=>{
        const options = [
          { label: '上海', value: 'sh' },
          { label: '南京', value: 'nj' },
          { label: '重庆', value: 'cq' },
          { label: '武汉', value: 'wh' },
        ]
        this.selectOptions = options;
        this.mulSelectLoading = false;
        this.mulSelecteds = ['cq','nj'];
      },1500)
    },
  },  
  mounted(){
    this.mockData();
  }
}
</script>  

子组件

<template>
  <el-select 
    size="mini" 
    multiple 
    :filterable="filterable"
    :disabled="disabled"
    v-model='selectedArr' 
    :loading="mulSelectLoading"
    :collapse-tags="collapseTags"
    placeholder='请选择'
    @change='changeSelect' 
    @remove-tag='removeTag'>
    <el-option label='全选' value='全选' @click.native='selectAll' v-if="selectOptions.length"></el-option>
    <el-option v-for='item in selectOptions' :key="item[values]" :label='item[labels]' :value='item[values]'></el-option>
  </el-select>
</template>

<script>
export default {
  name: 'MultipleSelect',
  data() {
    return {
      selectedArr: [],
    }
  },
  props:{
    //自定义label参数
    labels:{
      type:String,
      default(){
        return ''
      }
    },
    //自定义value参数
    values:{
      type:String,
      default(){
        return ''
      }
    },
    // 选项
    selectOptions:{
      type:Array,
      default(){
        return []
      }
    },
    // 是否禁用
    disabled:{
      type:Boolean,
      default:false
    },
    // 已选中选项
    mulSelecteds:{
      type:Array,
      default(){
        return []
      }
    },
    // 加载状态
    mulSelectLoading: {
      type: Boolean,
      default: false,
    },
    // 多选时是否将选中值按文字的形式展示
    collapseTags: {
      type: Boolean,
      default: true,
    },
    // 是否可搜索
    filterable: {
      type: Boolean,
      default: true,
    },
  },
  methods: {
    selectAll() {
      if (this.selectedArr.length < this.selectOptions.length) {
        this.selectedArr = []
        this.selectOptions.map((item) => {
          this.selectedArr.push(item.[this.values])
        })
        this.selectedArr.unshift('全选');
      } else {   
        // 取消全选
        this.selectedArr = [];
      }
      this.$emit('update:updateMultipleSelect',this.selectedArr);
    },
    changeSelect(val) {
      if (!val.includes('全选') && val.length === this.selectOptions.length) {
        this.selectedArr.unshift('全选')
      } else if (val.includes('全选') && (val.length - 1) < this.selectOptions.length) {
        this.selectedArr = this.selectedArr.filter((item) => { return item !== '全选'})
      }
      this.$emit('update:updateMultipleSelect',this.selectedArr);
    },
    removeTag(val) {
      if (val === '全选') {
        this.selectedArr = [];
        this.$emit('update:updateMultipleSelect',this.selectedArr);
      }
    }
  },
  watch:{
    mulSelecteds:{
      handler(newVal,oldVal){
        this.selectedArr = newVal;
        if (!this.selectedArr.includes('全选') && 
             this.selectedArr.length && 
             this.selectedArr.length === this.selectOptions.length) 
        {
          this.selectedArr.unshift('全选')
        }
      },
      immediate: true
    }
  }
}
</script>

标签:selectedArr,default,选择器,length,全选,selectOptions,type,下拉框
From: https://www.cnblogs.com/yx-liu/p/17448916.html

相关文章

  • CSS九种选择器你知道吗?
    表格table-相关标签:table表格,tr表示行,td表示列,th表头,caption表格标题-相关属性:border设置边框,rowspan跨行colspan跨列 表单form-作用:获取用户输入的内容,并提交给服务器-相关文本框:inputtype=text、password,radio,checkbox,date,file,select[......
  • 下拉框二级联动
    https://1x.antdv.com/components/cascader-cn/ <a-cascaderref="cascader"#钩子:allowClear="false"style="height:30px":options="depList":load-data="loadData"......
  • jquery 全选,反选复选框
    <!DOCTYPEhtml><htmllang="zh-CN"> <head> <metacharset="UTF-8"> <title>我的购物车-品优购</title> <linkrel="stylesheet"href="css/base.css"> <linkrel="styleshee......
  • of-type选择器的坑
    first-of-type,last-of-type,nth-of-type, nth-last-of-type选择器的用法和我们想象的不一样,可以说是不合常理它们的用法相同,就以nth-of-type举例:nth-of-type(1)选择同类型标签元素的第1个p:nth-of-type(1)用法合乎常理,就是第一个p元素.class:nth-of......
  • element-ui中Select 选择器value-key的使用
    场景描述很多时候我们都需要使用下拉框Select选择器。在获取值的时候,通常只需要传递对应的id给后端就行了。但是特殊情况,后端不想去查库,不仅需要我们id,还有name,code之类的。这个时候前端通过id去查询对应的name,code这样做会写循环,查询,非常的麻烦。其实Select选择器......
  • 前端下拉框组件CCDropDownFilter下拉框 筛选框 仿美团下拉筛选框
    快速实现下拉框筛选框仿美团下拉筛选框,请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12421效果图如下:    #下拉框使用方法####HTML代码部分```html<template><viewclass="content"><viewstyle="margin-top:16px;"><viewstyle="......
  • jquery/js 根据下拉框选择的值进行按钮展示
    学习如逆水行舟,不进则退~最近接了一个n年前的老项目增加新功能,本以为手到擒来结果再写页面上的效果时还是翻车了,特此记录一下~ 将近三四年没写jsp的页面了,基本忘光了,现在是要做一个批量下载的功能,但是又要是特定的某一个才有这个功能所以就有了以下的过程。一、实现效果......
  • CSS:页面美化和布局控制和选择器
    CSS:页面美化和布局控制和选择器概念:CascadingStyleSheets层叠样式表层叠:多个样式可以作用在同一个html的元素上,同时生效好处:功能强大将内容展示和样式控制分离降低耦合度。解耦让分工协作更容易提高开发效率CSS的使用:CSS与html结合方式内联样式在标签内使用style属......
  • JQuery框架 -- JQuery怎么使用和各个版本的区别、JQuery对象和JS对象区别、JQuery选择
    目录一、概念:一个JavaScript框架。简化JS开发。二、快速入门三、JQuery对象和JS对象区别与转换四、选择器:筛选具有相似特征的元素(标签)4.1、基本操作学习4.2、选择器分类    1.基本选择器      2.层级选择器      3.属性选择器      4.过滤......
  • js select下拉框选取默认学期
    termList.map(item=>{if(item.isOnTerm==1){termOpts+='<optionvalue="'+item.termId+'"selected>'+item.termName+'</option>';}else{......