el-select,el-tree支持重复label选择

接之前的代码,之前封装了一个treeselect组件,但是不支持重复label的勾选,移除有问题,这里重新封装了一个,可以直接粘贴复制,根据自己的需要修改

<!--
 * @Author: 
 * @Date: 
 * @LastEditors: Do not edit
 * @LastEditTime: 2024-05-27 15:23:54
 * @Description: 这个组件绑定了id,支持重复的label,但是会多渲染一遍option,通过v-show隐藏,并且需要把数据全部进行处理
 以平铺的形式赋值给select,数据量不大可以使用,数据量大了建议使用treeSelect插件
 * @FilePath: \vue2-simple-front-end-template\src\components\treeSelect\repeatLabelIndex.vue
-->
<template>
  <div>
    <el-select style="width: 100%" v-model="checkedKeys" multiple placeholder="请选择" @remove-tag="handleRemoveTag">
      <el-option v-for="item in transformArr" :key="item.id" :label="item.label" :value="item.id" v-show="false">
      </el-option>
      <div class="select-drown">
        <el-input placeholder="请输入筛选" v-model="filterValue" />
        <el-tree :data="treeData" show-checkbox default-expand-all node-key="id" ref="trees" highlight-current
          :check-strictly="true" :default-checked-keys="checkedKeys" @check="handleCheck"
          :filter-node-method="filterNode" :props="{ children: 'children', label: 'label', id: 'id' }" />
      </div>
    </el-select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      paramsQuery: [],
      checkedKeys: [],
      treeData: [
        {
          id: 1,
          label: '一级 1',
          children: [
            {
              id: 4,
              label: '二级 1-1',
              children: [
                {
                  id: 9,
                  label: '三级 1-1-1'
                },
                {
                  id: 10,
                  label: '三级 1-1-2'
                },
                {
                  id: 11,
                  label: '三级 1-1-2'
                }
              ]
            }
          ]
        },
        {
          id: 2,
          label: '一级 2',
          children: [
            {
              id: 5,
              label: '二级 2-1'
            },
            {
              id: 6,
              label: '二级 2-2'
            }
          ]
        },
        {
          id: 3,
          label: '一级 3',
          children: [
            {
              id: 7,
              label: '二级 3-1'
            },
            {
              id: 8,
              label: '二级 3-2'
            }
          ]
        },
        {
          id: 9090,
          label: '一级 1',
        }
      ],
      filterValue: '',
      selectNodesName: [],
      transformArr: [], // 转化后的平铺数组
    };
  },
  watch: {
    // 侦听filterValue 的变化,调用filter的方法
    filterValue(val) {
      this.$refs.trees.filter(val)
    },
  },
  computed: {},
  mounted() {
    // 树状数据转为平铺
    this.transform(this.treeData)
  },
  methods: {
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    },
    handleRemoveTag(id) {
      var num = -1
      // 通过id删除
      this.paramsQuery.forEach((item, index)=>{
        if(item.id === id){
          num = index
        }
      })
     this.paramsQuery.splice(num, 1)
     this.$refs.trees.setCheckedNodes(this.paramsQuery)
    },
    handleCheck(_, { checkedKeys, checkedNodes }) {
      console.log(checkedKeys, checkedNodes);
      this.checkedKeys = checkedKeys;
      this.paramsQuery = []
      if (Array.isArray(checkedNodes) && checkedNodes.length) {
        checkedNodes.forEach(item => {
          this.paramsQuery.push({
            id: item.id,
            label: item.label
          })
        })
      }
    },
    // 将树状结构转化为平铺
    transform(data){
      if(Array.isArray(data) && data.length){
        for (const item of data) {
          this.transformArr.push(item)
          if(item.children){
            this.transform(item.children)
          }
        }
      }else{
        return
      }
    }
  }
};
</script>

<style>
.select-drown {
  padding: 0px 15px;
}
</style>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值