首页 > 其他分享 >el-select 下拉框全选、多选的几种方式组件

el-select 下拉框全选、多选的几种方式组件

时间:2023-11-06 15:55:43浏览次数:43  
标签:el name value label item 全选 biddingStage 下拉框

组件一、基础多选

<template>
  <el-select v-model="value1" multiple placeholder="请选择">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value">
    </el-option>
  </el-select>
</template>
 
<script>
  export default {
    data() {
      return {
        options: [{
          value: '选项1',
          label: '黄金糕'
        }, {
          value: '选项2',
          label: '双皮奶'
        }, {
          value: '选项3',
          label: '蚵仔煎'
        }, {
          value: '选项4',
          label: '龙须面'
        }, {
          value: '选项5',
          label: '北京烤鸭'
        }],
        value1: []
      }
    }
  }
</script>

为el-select设置multiple属性即可启用多选,此时v-model的值为当前选中值所组成的数组。默认情况下选中值会以 Tag 的形式展现,你也可以设置collapse-tags属性将它们合并为一段文字。

<template>
  <el-select
    v-model="value2"
    multiple
    collapse-tags
    style="margin-left: 20px;"
    placeholder="请选择">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value">
    </el-option>
  </el-select>
</template>
 
<script>
  export default {
    data() {
      return {
        options: [{
          value: '选项1',
          label: '黄金糕'
        }, {
          value: '选项2',
          label: '双皮奶'
        }, {
          value: '选项3',
          label: '蚵仔煎'
        }, {
          value: '选项4',
          label: '龙须面'
        }, {
          value: '选项5',
          label: '北京烤鸭'
        }],
        value2: []
      }
    }
  }
</script>

组件二、el-select 下拉框多选实现全选
下拉项增加一个【全选】,然后应该有以下几种情况:

下拉选项全都勾选时,【全选】自动勾选;
下拉选项部分勾选时,点击【全选】后,所有下拉项全部勾选;
下拉选项全都未勾选时,点击【全选】后,所有下拉选项不勾选;
下拉选项和【全选】都选上的时候,不勾选任意下拉选项,【全选】按钮就不勾选了
效果图一、

<template>
    <el-select multiple collapse-tags v-model='selectedArray' @change='changeSelect' @remove-tag='removeTag' placeholder='请选择'>
        <el-option label='全选' value='全选' @click.native='selectAll'></el-option>
        <el-option v-for='(item, index) in options' :key='index' :label='item.name' :value='item.name'></el-option>
     </el-select>
</template>
 
export default {
  data() {
    return {
      selectedArray: [],
      options: [
        { name: '一一', label: 'one' },
        { name: '二二', label: 'tow' },
        { name: '三三', label: 'three' },
        { name: '四四', label: 'four' },
        { name: '五五', label: 'five' }
      ]
    }
  },
  methods: {
    selectAll() {
      if (this.selectedArray.length < this.options.length) {
        this.selectedArray = []
        this.options.map((item) => {
          this.selectedArray.push(item.name)
        })
        this.selectedArray.unshift('全选')
      } else {
        this.selectedArray = []
      }
    },
    changeSelect(val) {
      if (!val.includes('全选') && val.length === this.options.length) {
        this.selectedArray.unshift('全选')
      } else if (val.includes('全选') && (val.length - 1) < this.options.length) {
        this.selectedArray = this.selectedArray.filter((item) => {
          return item !== '全选'
        })
      }
    },
    removeTag(val) {
      if (val === '全选') {
        this.selectedArray = []
      }
    }
  }
}

效果图二、

代码:
直接添加一个【全选】复选框,实现的功能跟方法一是一样的

<template>
  <el-select multiple collapse-tags v-model='selectedArray' @change='changeSelect' placeholder='请选择'>
    <el-checkbox v-model="checked" @change='selectAll'>全选</el-checkbox>
    <el-option v-for='(item, index) in options' :key='index' :label='item.name' :value='item.name'></el-option>
  </el-select>
</template>
 
export default {
  data() {
    return {
      checked: false,
      selectedArray: [],
      options: [
        { name: '一一', label: 'one' },
        { name: '二二', label: 'tow' },
        { name: '三三', label: 'three' },
        { name: '四四', label: 'four' },
        { name: '五五', label: 'five' }
      ]
    }
  },
  methods: {
    selectAll() {
      this.selectedArray = []
      if (this.checked) {
        this.options.map((item) => {
          this.selectedArray.push(item.name)
        })
      } else {
        this.selectedArray = []
      }
    },
    changeSelect(val) {
      if (val.length === this.options.length) {
        this.checked = true
      } else {
        this.checked = false
      }
    }
  }
}
.el-checkbox {
    text-align: right;
    width: 100%;
    padding-right: 10px;
 }

效果图三、

下拉框和全选都加上 checkbox,选择框 el-select 全选 多选, el-option与el-checkbox的组合使用

需要注意的事项:

  1. el-select与el-checkbox-group的v-model 绑定的值,需相同,绑定同一个变量
  2. el-option的value与el-checkbox的label绑定的值也需要相同
  3. el-checkbox 需要使用 style=“pointer-events: none”, 是为了去掉鼠标事件,阻止事件冒泡,触发了两次el-select的change事件

代码如下:

 <template>
    <div>
        <el-select
            v-model="biddingStage"
            v-bind="$attrs"
            multiple
            style="width: 100%"
            placeholder="请选择线路"
            @change="handleSelect"
        >
            <div style="padding: 0 20px; line-height: 34px">
                <el-checkbox
                    v-model="checkAll"
                    :indeterminate="isIndeterminate"
                    @change="handleCheckAllChange"
                    >全选</el-checkbox
                >
            </div>
            <el-checkbox-group v-model="biddingStage">
                <el-option
                    v-for="item in options"
                    :key="item.value"
                    :label="item.name"
                    :value="item.value"
                >
                    <el-checkbox
                        style="pointer-events: none"
                        :label="item.value"
                    >
                        {{ item.value }}
                    </el-checkbox>
                </el-option>
            </el-checkbox-group>
        </el-select>
    </div>
</template>

<script>
export default {
    data() {
        return {
            checkAll: false, // 是否全选
            isIndeterminate: false, //全选复选框标识
            options: [
                { name: "京广高速", value: "京广高速" },
                { name: "京包客专", value: "京包客专" },
                { name: "京哈高速", value: "京哈高速" },
                { name: "崇礼线", value: "崇礼线" },
                { name: "京秦高铁", value: "京秦高铁" },
                { name: "京沪高铁", value: "京沪高铁" },
                { name: "京津城际", value: "京津城际" },
            ],
            biddingStage: [],
        };
    },
    methods: {
        // 下拉框选择事件
        handleSelect(value) {
            console.log(value, "value");
            const checkedCount = value.length;
            this.checkAll = checkedCount === this.options.length;
            this.isIndeterminate =
                checkedCount > 0 && checkedCount < this.options.length;
            const data = value.map((item) => {
                return item;
            });
            this.biddingStage = value.length > 0 ? data : [];
            console.log(this.biddingStage, " this.biddingStage");
        },
        // 全选事件
        handleCheckAllChange(val) {
            const data = this.options.map((item) => {
                return item.value;
            });
            this.biddingStage = val ? data : [];
            this.isIndeterminate = false;
        },
    },
};
</script>

<style lang="scss" scoped></style>

注: 如果需要把右边的√去掉,el-select加上class和popper-append-to-body=false属性,然后css修改
/deep/ .el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {
display: none;
}

效果图四、 全选全部选中的时候,下拉框的文字是全选,后面是 + 12 数量

思路:
由于添加了:collapse-tags 属性后,全选选中的时候,正常会默认选中第一个label的值显示,后面是 + 全部数量 -1 . 我们可以在初始化的时候,把默认选中的数组里面最前面添加一项“全选”

// 初始化给下拉框选中 的数组赋值
 
this.biddingStage = [ '京广高速','京包客专', '京哈高速','崇礼线','京沪高铁','京津城际']
 
this.biddingStage.unshift('全选')

然后在全选的方法里面:判断如果是全选就在最前面 添加1项 value 值 ‘全选’

// 全选事件
handleCheckAllChange(val) {
    const data = this.options.map(item => {
        return item.value
    })
    // this.biddingStage = val ? data : [];
     if (val) {
        this.biddingStage = data
        this.biddingStage .unshift('全选')
      } else {
        this.biddingStage  = []
      }
    this.isIndeterminate = false;
},

然后在 下拉框选项改变的时候:

  1. 先用arr1的变量存一下,把下拉框的数组 过滤出不含 全选的,剩余全部数据

  2. 用selectArr的变量存一下, value的数组 过滤出不含 全选的,剩余全部数据

然后用新的2个变量去 执行

      const checkedCount = selectArr.length
      this.isCheckAll = checkedCount === arr1.length
      this.isIndeterminate = checkedCount > 0 && checkedCount < arr1.length

最后在判断 this.isCheckAll 是否是 true 是的话,就是全选。 在数组最前面添加 1项 value ’全选‘
否则就移除 ’全选‘

      if (this.isCheckAll) {
        console.log('quanxuan')
        this.biddingStage.unshift('全选')
      } else {
        this.biddingStage = this.biddingStage.filter((item) => {
          return item !== '全选'
        })
        console.log(this.biddingStage)
      }

部分全部代码如下:

    // 线路下拉框选择事件
    handleSelect(value) {
      console.log('value:', value)
      const arr1 = this.options.filter((item) => {
        return item !== '全选'
      })
      const selectArr = value.filter((item) => {
        return item !== '全选'
      })
      const checkedCount = selectArr.length
      this.isCheckAll = checkedCount === arr1.length
      this.isIndeterminate = checkedCount > 0 && checkedCount < arr1.length
      if (this.isCheckAll) {
        console.log('quanxuan')
        this.biddingStage.unshift('全选')
      } else {
        this.biddingStage= this.biddingStage.filter((item) => {
          return item !== '全选'
        })
        console.log(this.biddingStage)
      }
    },

标签:el,name,value,label,item,全选,biddingStage,下拉框
From: https://www.cnblogs.com/hxy--Tina/p/17812871.html

相关文章

  • 一种Mysql和Mongodb数据同步到Elasticsearch的实现办法和系统
    本文分享自天翼云开发者社区《一种Mysql和Mongodb数据同步到Elasticsearch的实现办法和系统》,作者:l****n核心流程如下: 核心逻辑说明:MySQLBinlog解析:首先,从MySQL的二进制日志(Binlog)中解析出表名。这一步骤非常关键,因为我们只关注特定表的数据变更。进一步,我们检查Binlog中......
  • PigVar: THE PIG VARIATIONS AND POSITIVE SELECTION DATABASE
    URL: http://www.ibiomedical.net/ http://103.53.216.7/Gotoaldbdatabase.(keywords:chicken,cow,pig;lincRNAs;expression;blast)ALDB:adomestic-animallongnoncodingRNAdatabase GotomiRBonddatabase.(keywords:pig,chicken,cow,targetscan,miRand......
  • ERROR 1044 (42000) ERROR 1142 (42000): SELECT command denied to user ''@'localho
    ERROR:Accessdeniedforuser'root'@'localhost'(usingpassword:NO)   发现:   mysql-uroot@localhost-p成功   mysql-uroot-p失败   mysql>SELECTuser,hostFROMmysql.user;   ERROR1142(42000):SELECTcommanddeniedtouser&......
  • MySQL中表复制:create table like 与 create table as select
    1   CREATETABLEALIKEB此种方式在将表B复制到A时候会将表B完整的字段结构和索引复制到表A中来。2.  CREATETABLEAASSELECT*FROMB此种方式只会将表B的字段结构复制到表A中来,但不会复制表B中的索引到表A中来。这种方式比较灵活可以在复制原表表结构的同时指定要复......
  • 如何使用Python将PDF转为Excel
    PDF文件是一种静态文档格式,通常难以编辑,而Excel则是一个灵活的表格工具。如果你需要处理PDF表格中的数据,那么将其导出为Excel文件可以大大节省工作时间和精力。Excel提供的强大数据编辑和格式化功能,允许你对转换后的PDF数据进行修改、排序、筛选、计算等操作。同时,你还可以调整单......
  • 搜索文档树,bs4其它用法,css选择器,selenium基本使用,selenium其它用法
    1搜索文档树......
  • 【转载】The Beginner’s Guide to Creating and Selling Cheat Sheets
    【from】https://medium.com/practice-in-public/the-beginners-guide-to-creating-and-selling-cheat-sheets-23756af06b12Thisis10xbetterthanyour50-pageebookHaveyoueverwishedyoucouldcutthroughthenoiseandgettotheheartofatopicquickly?E......
  • 2023-11-06 Could not find any Electron packages in devDependencies ==》没有安装E
    问题描述:electron项目安装好后,运行npmrunstart时报错。解决方案:npmielectron--save-dev推荐使用powershell终端来输入,如果你用的是vscode的终端会出现卡在加载中的情况,而前者则可以通过回车键来刷新加载状态安装完成时重新运行npmrunstart,你会看到欢迎界面: ......
  • Linkless Link Prediction via Relational Distillation
    目录概符号说明LLP代码GuoZ.,ShiaoW.,ZhangS.,LiuY.,ChawlaN.V.,ShahN.andZhaoT.Linklesslinkpredictionviarelationaldistillation.ICML,2023.概从GNN教师模型蒸馏到MLP学生模型.符号说明\(G=(\mathcal{V,E})\),无向图;\(\mathbf{A}\in......
  • How to search for ? (question mark) in Excel
    The?isawildcardwhichrepresentsasinglecharacter,andthe*isawildcardcharacterthatrepresentsanystringofcharacters.Whensearchingforeitherwildcardcharacter,Excelwillsimplyfindeverything,whetherornottheseactualcharactersapp......