【详解代码】vue element el-select选择器多选下拉框实现全选功能和取消全选

解决方法 下拉项增加一个【全部】

⭐️效果图如下:

默认全选

在这里插入图片描述

情况一:下拉选项全都勾选时,【全部】自动勾选;

情况二:下拉选项全都未勾选时,点击【全部】后,所有下拉选项全部勾选;

在这里插入图片描述

情况三: 取消一项

在这里插入图片描述

情况四: 取消全部项

情况五: 取消勾选【全部】项

在这里插入图片描述

⭐️详细代码如下:

        <div style="width: 20%">
          <span class="width_t">推荐原因:</span>
          <el-select
            v-model="reason"
            multiple
            clearable
            collapse-tags
            placeholder="请选择"
            style="width: 170px;"
            @change="getReason">
            <el-option
              :key="'全部'"
              :label="'全部'"
              :value="'全部'"/>
            <el-option
              v-for="item in reasonOption"
              :key="item.value"
              :label="item.lable"
              :value="item.value"
            />
          </el-select>
        </div>
import { getDictDetailData } from '../../../../api/dvas'
export default {
 data() {
    return {
      reason: '',
      reasonOption: [],
      allReasonFlag: false
       }
    },
mounted() {
// 一开始从这里进
    this.getDictDetail()
  },
  methods: {
    // 推荐原因下拉框接口
    getDictDetail() {
      const that = this
      var par = { dict_id: '51' }
      // getDictDetailData接口名称
      getDictDetailData(par).then(res => {
      // 接口返回的数据存在reasonOption数组中
        that.reasonOption = res.data
        // 将“全部”传到getReason方法里
        that.getReason('全部')
      })
    },
    // allReasonFlag默认为false
 getReason(data) {
 // 当allReasonFlag为true时,进的是if里的。
      if (this.allReasonFlag) {
      // 设置allReasonFlag为false,重置状态
        this.allReasonFlag = false
        // 如果allReasonFlag为true,表示之前已经选择了全部原因,那么如果传入的数据中包含"全部",则将除了"全部"以外的其他原因添加到reason中,也就是取消选择的操作,取消任意选项,如果没有取消勾选"全部"这个选项,就过滤掉"全部“,把已经勾选的除了'全部'剩下的按钮都存在reason里。此时allReasonFlag为false。
        if (data.indexOf('全部') > -1) {//🚀全选之后取消某些选项
          this.reason = data.filter(res => res !== '全部') // indexOf()方法来检查字符串data中是否包含"全部"这个子串。如果包含,indexOf()方法会返回该子串在字符串中的起始位置,如果不包含,indexOf()方法会返回-1。
        } else {//🚀全选之后取消全部选项 
        // 这里是直接取消“全部”这个选项,此时什么都不选,reason为空
          this.reason = []
        }
      } else { // 由于allReasonFlag默认为false,所以一开始进的是else里的。第一种情况:因为上边getDictDetail()里写了 that.getReason('全部'),也就是一开始就把“全部”传进来了。进的是下边if里。第二种情况:点击‘全部’项后,改为全部状态
        if (data.indexOf('全部') > -1) {//🚀选择“全部”选项
         // 如果传入的数据中包含"全部",则将reason设置为包含全部原因和其他所有原因的数组,并且设置allReasonFlag为true。因为在这里设置了allReasonFlag为true,所以下一次操作的时候进的上边的if。
          this.reason = ['全部', ...this.reasonOption.map(res => res.value)]
          this.allReasonFlag = true
        } else {// 否则不包含全部,就是进的这里边,如果传入的数据长度等于原始选项的长度,也就是选了除了“全部”项的其他所有选项,则将reason设置为包含全部原因和其他所有原因的数组,同时将allReasonFlag设置为true
          if (data.length === this.reasonOption.length) {//🚀选择除“全部”外全部选项
            this.reason = ['全部', ...this.reasonOption.map(res => res.value)]
            this.allReasonFlag = true
          } else {//🚀选择某些选项
            this.reason = data// 否则将reason设置为传入的数据。选的某几项就传入几项
          }
        }
      }
    },
  }
}

getReason(data)是一个函数,根据传入的数据来设置一个变量reason的值。根据代码逻辑,如果allReasonFlag为true,表示之前已经选择了全部原因,那么如果传入的数据中包含"全部",则将除了"全部"以外的其他原因添加到reason中;否则将reason置为空数组。如果allReasonFlag为false,表示之前没有选择全部原因,那么如果传入的数据中包含"全部",则将reason设置为包含全部原因和其他所有原因的数组;否则,如果传入的数据长度等于原始选项的长度,则将reason设置为包含全部原因和其他所有原因的数组,同时将allReasonFlag设置为true;否则将reason设置为传入的数据。

🚀写在最后

希望我的分享能够帮助到更多的人,如果觉得我的分享有帮助的话,请大家一键三连支持一下哦~
❤️原创不易,期待你的关注与支持~
点赞👍+收藏⭐️+评论✍️
😊之后我会继续更新前端学习小知识,关注我不迷路~

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据引用和引用的内容,el-select多选下拉框的图形是通过绑定class属性来实现的。在代码中,使用了el-tag组件来展示每个选项,并通过v-for指令循环遍历selectTags数组来生成多个标签。在标签上绑定了一个click事件,当标签被点击时,会触发multipleSelect方法。在multipleSelect方法中,通过判断multipleList数组中是否包含当前点击的标签,来决定是否选中或取消选中该标签。当标签被选中时,将其添加到multipleList数组中,当标签被取消选中时,将其从multipleList数组中移除。通过为选中的标签添加一个multipleSelected的class,从而改变标签的样式,实现多选下拉框的图形效果。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [el-select 下拉框多选实现全选实现](https://download.csdn.net/download/weixin_38530115/12938462)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue实现多选改变样式](https://blog.csdn.net/sakura12138888/article/details/114627704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小魔女千千鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值