Element-select增加全选功能

element虽然功能很强大,也很方便,但是在实际开发中还是有很多不足,比方说下拉框多选时没有全选功能,这里的下拉框包含el-select和el-cascader级联选择器。这里我们都来封装一个组件,弥补下这个不足。
这里组件我们采用的是vue2.0,来看下代码实现:

<template>
  <el-select
    v-model="currentChoiceEle"
    :size="size"
    :style="{width: width + 'px'}"
    :filterable="filterable"
    multiple
    collapse-tags
    collapse-tags-tooltip
    @change="selectChange"
  >
    <el-option :label="allOptions.label" :value="allOptions.value"></el-option>
    <el-option v-for="(item, i) in options" :key="i" :label="item.label" :value="item.value"> </el-option>
  </el-select>
</template>

<script>
/**
 * options {label: "", value: ""}
 * width 宽度
 * 获取选中结果 change事件
 * all 是全部
 * size 大小
 * filterable 是否支持筛选
 */
export default {
  name: "AiSelectAllEle",
  props: {
    options: {
      type: Array,
      default: () => {
        return [];
      }
    },
    width: {
      type: Number,
      default: 180
    },
    filterable: {
      type: Boolean,
      default: true
    },
    size: {
      type: String,
      default: "mini"
    }
  },
  watch: {
    options() {
      if (!this.options.length) {
        this.currentChoiceEle = [];
        return;
      }
      this.currentChoiceEle = [];
      this.selectStoreAll();
      this.sendSelectObj();
    }
  },
  beforeDestroy() {
    this.currentChoiceEle = [];
  },
  data() {
    return {
      allOptions: { label: "全部", value: "all" }, // 全部
      saveSelectData: [],
      currentChoiceEle: []
    };
  },
  mounted() {
    if (!this.options.length) return;
    this.selectStoreAll();
    this.sendSelectObj();
  },
  methods: {
    selectChange(val) {
      let all = this.allOptions.value;
      // 之前没有全选 现在有了 点击了全选 全部选中
      if (val && !this.saveSelectData.includes(all) && val.includes(all)) {
        let selectArray = [];
        this.options.forEach((item) => {
          selectArray.push(item.value);
        });
        selectArray.unshift(this.allOptions.value);
        val = [...selectArray];
        this.currentChoiceEle = selectArray;
        this.saveSelectData = [...val];
        this.$nextTick(() => {
          this.sendSelectObj();
        });
        return;
      }
      // 之前有全选 又点击了全选 全取消
      if (val && this.saveSelectData.includes(all) && !val.includes(all)) {
        this.currentChoiceEle = [];
        this.saveSelectData = [];
        this.$nextTick(() => {
          this.sendSelectObj();
        });
        return;
      }
      // 当点选了除全部按钮外的所有 选中全部按钮
      if (val && !val.includes(all) && val.length === this.options.length) {
        val.unshift(all);
      }
      // 当全部选项都选中 这时取消了除全部按钮外的一个 去掉选中全部按钮
      if (val && val.includes(all) && val.length - 1 < this.options.length) {
        val = val.filter((item) => {
          return item !== this.allOptions.value;
        });
        this.currentChoiceEle = [...val];
      }
      this.sendSelectObj();
      this.saveSelectData = [...val];
    },
    selectStoreAll() {
      if (this.currentChoiceEle.length < this.options.length) {
        let selectArray = [];
        this.options.forEach((item) => {
          selectArray.push(item.value);
        });
        selectArray.unshift(this.allOptions.value);
        this.currentChoiceEle = selectArray;
      } else {
        this.currentChoiceEle = [];
      }
      this.saveSelectData = [...this.currentChoiceEle];
    },
    sendSelectObj() {
      this.$emit("change", this.currentChoiceEle);
    }
  }
};
</script>

<style scoped></style>

这个代码干货满满,大家直接复制到项目中即可,使用时:

<ai-select-all-ele
  :options="optionsList"
  @change="selectChangeFun"
  :width="150"
/>

optionsList = [
  {
    label: "商品1",
    value: 1,
  },
  {
    label: "商品2",
    value: 2,
  },
]

代码逻辑都有注释,有帮助到大家的话,点个赞不过分吧!

要实现el-select全选功能,可以通过在下拉项中增加一个【全选】选项,并根据不同情况设置以下功能: 1. 当所有下拉选项都被勾选时,【全选】自动勾选。 2. 当部分下拉选项被勾选时,点击【全选】后,所有下拉项都被勾选。 3. 当所有下拉选项都未被勾选时,点击【全选】后,所有下拉项都不被勾选。 4. 当下拉选项和【全选】都被选中时,如果取消勾选任意下拉选项,【全选】按钮也不被勾选。 通过以上的修改,就可以实现el-select全选功能了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Element-ui中 选择器(select)多选下拉框实现全选功能](https://blog.csdn.net/ZYS10000/article/details/120118373)[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: 33.333333333333336%"] - *2* [el-select多选下拉框实现全选功能](https://blog.csdn.net/weixin_45283768/article/details/103462381)[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: 33.333333333333336%"] - *3* [el-select 下拉框多选实现全选的实现](https://download.csdn.net/download/weixin_38651786/13664811)[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: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值