el-select嵌套el-tree实现多选或者单选

3 篇文章 0 订阅
这篇博客介绍了如何在Vue.js项目中利用Element UI组件库创建单选和多选的下拉树。通过``和``结合``组件,展示了两种实现方式,包括单击节点选择和使用checkbox进行多选。同时,提供了节点点击事件处理和选中值的同步方法。
摘要由CSDN通过智能技术生成

实现单选有两种方法

方法一

html片段

<el-select v-model="treeData" placeholder="请选择..." style="width: 16rem">
      <el-option :value="treeDataValue" style="height: auto">
        <el-tree
          ref="tree"
          :data="data"
          default-expand-all
          node-key="id"
          :props="defaultProps"
          @node-click="handleNodeClick"
        />
      </el-option>
    </el-select>

js代码

<script>
export default {
  data() {
    return {
      treeData: "",
      treeDataValue: "",
      data: [
        {
          id: 1,
          name: "一级 1",
          children: [
            {
              id: 4,
              label: "二级 1-1",
            },
          ],
        },
        {
          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: {
        children: "children",
        label: "name",
      },
    };
  },
  methods: {  handNodeClick(data,node,nodeData){
      this.treeDataValue= data
      this.treeData= data.name
  }},
};
</script>>

这里treeDataValue 为当前节点数据;treeData相当于label,就是想要显示的值,注意设置node-key。

方法二使用label和value赋值

html代码

<el-select v-model="treeData" placeholder="请选择..." style="width: 16rem">
    <el-option :value="treeDataValue" style="height: auto" :label="treeData">
      <el-tree
        ref="tree"
        :data="data"
        default-expand-all
        node-key="id"
        :props="defaultProps"
        @node-click="handleNodeClick"
      />
    </el-option>
  </el-select>

js代码

export default {
  data() {
    return {
      treeData: "",
      treeDataValue: "",
      data: [
        {
          id: 1,
          name: "一级 1",
          children: [
            {
              id: 4,
              label: "二级 1-1",
            },
          ],
        },
        {
          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: {
        children: "children",
        label: "name",
      },
    };
  },
  methods: {  
    handNodeClick(data){      
      this.treeDataValue= data.id      
      this.treeData= data.name  
    }
  }
};

实现多选

html片段

 <el-select v-model="mineStatus" placeholder="请选择" multiple collapse-tags @change="selectChange">
      <el-option  :value="mineStatusValue" style="height: auto">//option展开高度太小,把height设置为auto就好啦
       	<el-tree :data="data" show-checkbox node-key="id" ref="tree" highlight-current :props="defaultProps" @check-change="handleCheckChange"></el-tree>
	  </el-option>
  </el-select>

js片段

<script>
export default {
  data() {
    return {
      mineStatus: "",
      mineStatusValue: [],
      data: [
        {
          id: 1,
          label: "一级 1",
          children: [
            {
              id: 4,
              label: "二级 1-1"
            }
          ]
        },
        {
          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"
            }
          ]
        }
      ],
      defaultProps: {
        children: "children",
        label: "label"
      }
    };
  },
  methods: {
//select框值改变时候触发的事件
selectChange(e){
	  var arrNew = [];
      var dataLength = this.mineStatusValue.length;
      var eleng = e.length;
      for(let i = 0; i< dataLength ;i++){
        for(let j = 0; j < eleng; j++){
          if(e[j] === this.mineStatusValue[i].label){
            arrNew.push(this.mineStatusValue[i])
          }
        }
      }
      this.$refs.tree.setCheckedNodes(arrNew);//设置勾选的值
},
 handleCheckChange() {
      let res = this.$refs.tree.getCheckedNodes(true, true); //这里两个true,1. 是否只是叶子节点 2. 是否包含半选节点(就是使得选择的时候不包含父节点)
      let arrLabel = [];
      let arr = [];
      res.forEach(item => {
        arrLabel.push(item.label);
        arr.push(item);
      });
      this.mineStatusValue = arr;
      this.mineStatus = arrLabel;
      console.log('arr:'+JSON.stringify(arr))
      console.log('arrLabel:'+arrLabel)
    }
  }
};
</script>>

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值