elementui级联选择器实现一级单选 二级多选

这篇博客介绍了如何在ElementUI的级联选择器中实现一级选项的单选和二级选项的多选功能。由于ElementUI本身不支持这种场景,博主通过代码魔改实现了这一需求。

elementui原生并不支持这种  场景只能魔改一下 下面直接上代码

<template>
  <el-cascader
    v-model="selectedValues"
    :options="modifiedOptions"
    :props="{ multiple: true, checkStrictly: true }"
    collapse-tags
    ref="refSelect"
    :show-all-levels="false"
    @change="changeLabel"
    clearable
  ></el-cascader>
</template>

<script>
export default {
  props: {
    cascaderOptions: {
      type: Array
    }
  },
  mounted() {
    console.log(this.$refs.cascader)
  },
  data() {
    return {
      selectedValues: [],
      shareScopeEnd: []
    }
  },
  computed: {
    modifiedOptions() {
      return this.cascaderOptions.map((option) => {
        if (option.children) {
          return {
            ...option,
            disabled: true
          }
        } else {
          return option
        }
      })
    }
  },
  methods: {
    changeLabel(val) {
      // 是否与上次的类型相同
      let changeFlag = false
      let changeItem = null

      if (this.shareScopeEnd.length == 0) {
        this.selectedValues = val
      } else {
        // 与原数组比对
        this.selectedValues.forEach((item) => {
          if (item[0] !== this.shareScopeEnd[0][0]) {
            console.log(1)
            // 一级标签不同
            changeFlag = true
            changeItem = item
          } else if (
            (!item[1] && this.shareScopeEnd[0][1]) ||
            (item[1] && !this.shareScopeEnd[0][1])
          ) {
            changeFlag = true
            changeItem = item
          }
        })
      }
      if (changeFlag) {
        this.selectedValues = []
        this.selectedValues.push(changeItem)
      }

      function flatten(arr) {
        while (arr.some((item) => Array.isArray(item))) {
          // 如果当前数组中还有数组,则展开
          arr = [].concat(...arr)
        }
        return arr
      }
      this.shareScopeEnd = this.selectedValues
      let shareScopeEnd2 = flatten(this.selectedValues)
      let shareScopeEnd3 = [...new Set(shareScopeEnd2)]
      if (shareScopeEnd3[0] == '') {
        this.$emit('cascaderEmit', shareScopeEnd3.slice(1))
        return
      }
      this.$emit('cascaderEmit', shareScopeEnd3)
    }
  }
}
</script>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

随时提桶de

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

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

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

打赏作者

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

抵扣说明:

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

余额充值