elementui中el-select和el-tree实现下拉树形多选功能

实现效果如下:
在这里插入图片描述
代码如下:
html中

   <el-col :lg="12">
                          <el-form-item label="可用单位" prop="useOrgListTemp">
                            <div class="departAll">
                            <el-select
                              ref="selectTree"
                              v-model="valueName"
                              :value="valueMultiple"
                              multiple
                              clearable
                              @remove-tag="changeValue"
                              @clear="clearHandle"
                              placeholder="请选择可用单位"
                            >
                              <div
                                style="padding-left: 22px; margin-bottom: 6px;margin-top:2px"
                              >
                                <el-checkbox @change="myDepartChage" v-model="mychecked"
                                  >我所在的部门:</el-checkbox
                                ><span style="margin-left:6px">{{myDepart.name}}</span>
                              </div>
                              <div style="padding-left: 22px">
                                <el-checkbox @change="myAllChage" v-model="allchecked"
                                  >全选</el-checkbox
                                >
                              </div>
                              <el-option
                                :value="valueName"
                                style="height: auto; background: #fff"
                              >
                                <el-tree
                                  :data="data"
                                  show-checkbox
                                  ref="tree"
                                  node-key="id"
                                  id="tree-option"
                                  default-expand-all
                                  :props="defaultProps"
                                  @check-change="handleNodeClick"
                                >
                                  <span
                                    class="custom-tree-node"
                                    slot-scope="{ data }"
                                  >
                                    <span>{{ data.name }}</span></span
                                  >
                                </el-tree>
                              </el-option>
                            </el-select>
                            </div>
                          </el-form-item>
                        </el-col>

data中

   valueName: [],
      valueMultiple: [],
      choosedValue: [],
      mychecked: true,
      allchecked: false,
      myDepart: {
        id: 9,
        name: "三级 1-1-1",
      },
      data: [
        {
          id: 1,
          name: "一级 1",
          children: [
            {
              id: 4,
              name: "二级 1-1",
              children: [
                {
                  id: 9,
                  name: "三级 1-1-1",
                },
                {
                  id: 10,
                  name: "三级 1-1-2",
                },
              ],
            },
          ],
        },
        {
          id: 2,
          name: "一级 2",
          children: [
            {
              id: 5,
              name: "二级 2-1",
            },
            {
              id: 6,
              name: "二级 2-2",
            },
          ],
        },
        {
          id: 3,
          name: "一级 3",
          children: [
            {
              id: 7,
              name: "二级 3-1",
            },
            {
              id: 8,
              name: "二级 3-2",
            },
          ],
        },
      ],
      defaultProps: {
        value: "id",
        children: "children",
        label: "name",
      },

mounted中

this.choosedValue=[]
    this.choosedValue.push(this.myDepart.id)
     this.$refs.tree.setCheckedKeys(this.choosedValue);

methods中

 // 选择所属部门
    myDepartChage(val){

      if(val==true){
        if(this.choosedValue.indexOf(this.myDepart.id)==-1){
          this.choosedValue.push(this.myDepart.id)
        }
        this.choosedValue=[...new Set(this.choosedValue)]
        this.$refs.tree.setCheckedKeys(this.choosedValue);
      }else{
      
       if(this.choosedValue.indexOf(this.myDepart.id)!=-1){
         this.choosedValue.forEach((item,index)=>{
          if(item==this.myDepart.id){
            this.choosedValue.splice(index,1)
          }
         })
        }
          this.choosedValue=[...new Set(this.choosedValue)]
        this.$refs.tree.setCheckedKeys(this.choosedValue);
      }
    },
       // 全选
    myAllChage(val){
     if(val==true){
        this.mychecked=true
          this.data.forEach((item, index) => {
            this.choosedValue.push(item.id)
          });
        this.choosedValue=[...new Set(this.choosedValue)]
        this.$refs.tree.setCheckedKeys(this.choosedValue);
     }else{
      this.mychecked=false
      this.choosedValue=[]
      this.$refs.tree.setCheckedKeys([]);

     }
    },
    // 点击树形选择节点
    handleNodeClick(node, checked) {
      if (checked) {
        if (node.children == null || node.children == undefined) {
         if(node.id==this.myDepart.id){
          this.mychecked=true
         }
          let num = 0;
          this.valueName.forEach((item) => {
            item == node[this.defaultProps.label] ? num++ : num;
          });
          if (num == 0) {
            this.valueName.push(node[this.defaultProps.label]);
            this.choosedValue.push(node["id"]);
              this.choosedValue=[...new Set(this.choosedValue)]
               this.valueName=[...new Set(this.valueName)]
          }
        }
      } else {
        if (node.children == null || node.children == undefined) {
          this.valueName.map((item, index) => {
            if(node.id==this.myDepart.id){
              this.mychecked=false
            }
            if (node.name == item) {
              this.valueName.splice(index, 1);
            }
          });
          this.choosedValue.map((item,index)=>{
            if (node.id == item) {
              this.choosedValue.splice(index, 1);
            }
          })
        }
      }
      console.log(this.choosedValue)
      console.log(this.valueName)
    },
    // 删除单个标签
    changeValue(val) {
      const a = this.findItemByName(this.data, val);
      if(a.id==this.myDepart.id){
        this.mychecked=false
        this.choosedValue.forEach((item, index) => {
        if (item == this.myDepart.id) {
          this.choosedValue.splice(index, 1);
        }

      });
      }
      this.choosedValue.forEach((item, index) => {
        if (item == a.id) {
          this.choosedValue.splice(index, 1);
        }

      });
      this.$refs.tree.setCheckedKeys(this.choosedValue);
    },
    // 递归找到符合的元素
    findItemByName(items, targetName) {
      for (let i = 0; i < items.length; i++) {
        const currentItem = items[i];
        if (currentItem.name === targetName) {
          return currentItem;
        }

        if (currentItem.children) {
          const foundItem = this.findItemByName(
            currentItem.children,
            targetName
          );
          if (foundItem) {
            return foundItem;
          }
        }
      }
    },
    // 清空所有标签
    clearHandle() {
      this.valueName = [];
      this.mychecked=false
      this.allchecked=false;
      this.choosedValue=[]
      this.clearSelected();
    },
    clearSelected() {
      this.$refs.tree.setCheckedKeys([]);
    },

css中 多选框元素太多的话 设置最大高度 超出最大高度后 上下滚动

.departAll{
  ::v-deep .el-select__tags{
    max-height:90px;
    overflow-y: auto;
  }
}
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用 `el-select` 和 `el-tree` 配合使用来实现树形结构下拉单选。 首先,需要将数据转换为 `el-tree` 的节点格式,例如以下数据: ```javascript const treeData = [ { id: 1, label: '节点1', children: [ { id: 2, label: '节点1-1' }, { id: 3, label: '节点1-2' } ] }, { id: 4, label: '节点2', children: [ { id: 5, label: '节点2-1' }, { id: 6, label: '节点2-2' } ] } ] ``` 需要转换为 `el-tree` 的节点格式: ```javascript const treeNodes = [ { id: 1, label: '节点1', children: [ { id: 2, label: '节点1-1', isLeaf: true }, { id: 3, label: '节点1-2', isLeaf: true } ] }, { id: 4, label: '节点2', children: [ { id: 5, label: '节点2-1', isLeaf: true }, { id: 6, label: '节点2-2', isLeaf: true } ] } ] ``` 其,每个节点需要添加 `isLeaf` 属性,用于标记该节点是否为叶子节点。 接着,在 `el-select` 使用 `el-tree` 作为下拉选项。代码示例: ```html <template> <el-select v-model="selectedItem" placeholder="请选择" clearable> <el-tree :data="treeNodes" :props="treeProps" :node-key="treeProps.id" :highlight-current="true" :default-expand-all="true" :expand-on-click-node="false" v-if="treeVisible"></el-tree> <el-option v-else v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option> </el-select> </template> <script> export default { data() { return { selectedItem: null, treeNodes: [ { id: 1, label: '节点1', children: [ { id: 2, label: '节点1-1', isLeaf: true }, { id: 3, label: '节点1-2', isLeaf: true } ] }, { id: 4, label: '节点2', children: [ { id: 5, label: '节点2-1', isLeaf: true }, { id: 6, label: '节点2-2', isLeaf: true } ] } ], treeProps: { children: 'children', label: 'label', isLeaf: 'isLeaf' }, options: [ { label: '选项1', value: '1' }, { label: '选项2', value: '2' }, { label: '选项3', value: '3' } ], treeVisible: false } }, watch: { selectedItem(val) { if (val && val.children && val.children.length > 0) { this.treeVisible = true } else { this.treeVisible = false } } } } </script> ``` 上述代码,`el-select` 的下拉选项分为两部分:`el-tree` 和 `el-option`。根据当前选的节点是否有子节点,判断显示 `el-tree` 还是 `el-option`。 在 `el-tree` ,需要设置 `props` 属性,指定节点数据的属性名,以及 `node-key` 属性,用于标识节点的唯一属性名。其他属性根据实际需求进行设置。 在 `watch` ,根据当前选的节点是否有子节点,控制 `el-tree` 的显示与隐藏。 注意:以上代码只实现树形结构下拉单选的基本功能,还需要根据实际需求进行修改和完善。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值