element-ui中el-cascader实现全选功能

el-cascader一层级实现全选功能

在这里插入图片描述

前言

由于特殊需要,需要在多个検索バー统一使用el-cascader来实现.但由于element并未提供改功能,简单做下总结

业务需求

在只有一层级的数据中(没有children)实现全选功能

工具

  1. codepen在线编码
  2. element-ui官网-级联选择器

代码

可以直接copy到在线编码工具中

HTML

<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/element-ui@2.15.7/lib/index.js"></script>
<div id="app">
<!-- 核心代码 -->
  <el-cascader
    v-model="checkedForm.org_names"
    :options="org_options"
    :props="props"
    collapse-tags
    @change="cardChange"
    clearable></el-cascader>
</div>

CSS

@import url("//unpkg.com/element-ui@2.15.7/lib/theme-chalk/index.css");

JS

var Main = {
  data() {
    return {
      props: { multiple: true },
      earlySelected: [],
      checkedForm: {
        org_names: []
      },
      // 对于半全选,判断全选功能的进入或是退出
      flag: false,
      org_options: [
        {
          value: "",
          label: "全て"
        },
        {
          value: "1",
          label: "东南"
        },
        {
          value: "2",
          label: "西北"
        },
        {
          value: "3",
          label: "东北"
        },
        {
          value: "4",
          label: "西南"
        }
      ]
    };
  },
  methods: {
    cardChange(event) {
      const currentSelected = event.map((items) => items[0]);
      const differenceMakers = [
        ...currentSelected.filter((item) => !this.earlySelected.includes(item)),
        ...this.earlySelected.filter((item) => !currentSelected.includes(item))
      ];
      if (differenceMakers.includes("")) {
        if (currentSelected.includes("")) {
          // 全選択
          this.checkedForm.org_names = this.org_options.map(
            (item) => item["value"]
          );
          this.flag = true
        } else {
          // 全選択解消
          this.checkedForm.org_names = [];
          this.flag = false
        }
      } else {
        const options = this.org_options
          .map((item) => item["value"])
          .filter((item) => item);
        const optionsSelectedCurrent = currentSelected.filter((item) => item);
        if (options.length === optionsSelectedCurrent.length) {
          this.checkedForm.org_names = this.org_options.map(
            (item) => item["value"]
          );
          this.flag = true
        } else if (options.length > optionsSelectedCurrent.length) {
          this.checkedForm.org_names = this.flag ? this.org_options
            .filter((item) => item["value"])
            .filter((item) => item["value"] !== differenceMakers[0])
            .map((item) => item["value"]) : event.map((items) => items[0]);
          this.flag = false
        } else {
          this.checkedForm.org_names = [];
        }
      }
      this.earlySelected = this.checkedForm.org_names;
    }
  }
};
var Ctor = Vue.extend(Main);
new Ctor().$mount("#app");

思路分析

主体代码
和全选有关
当前选择为全选需要做什么
当前选择为取消全选需要做什么
半全选<和全选无关>
当除全选按钮外全部选中需要做什么
对半全选操作需要做什么
判断是否是从全选状态转换成半全选
对其他情况需要做什么

注意

  1. 绑定的值并不是提交的值,基于自己需求做处理。
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值