当前位置: 首页 > news >正文

el-select 结合 el-tree:树形下拉数据

一、单选

<template><div class="selectTree-wapper"><el-selectv-model="selectValue"placeholder="请选择"popper-class="custom-el-select-class"ref="selectRef"clearable@clear="clearHandle"><el-option :label="selectlabel" :value="selectValue"><el-tree:data="treeData":props="defaultProps"node-key="id"highlight-current:check-strictly="true":expand-on-click-node="true"ref="treeRef"@node-click="handleNodeClick"><template #default="{ node, data }"><span :class="{ 'special-node': data.id === selectValue }">{{ node.label }}</span></template></el-tree></el-option></el-select></div>
</template><script>
export default {name: "selectTree",components: {},props: {},data() {return {selectlabel: "", // 选项labelselectValue: "", // 选项valuetreeData: [{id: "1",name: "一级 1",children: [{id: "2",name: "二级 1-1",children: [{id: "3",name: "三级 1-1-1",},],},],},{id: "4",name: "一级 2",children: [{id: "5",name: "二级 2-1",children: [{id: "6",name: "三级 2-1-1",},],},{id: "7",name: "二级 2-2",children: [{id: "8",name: "三级 2-2-1",},],},],},],defaultProps: {children: "children",label: "name",},};},mounted() {},methods: {/*** 点击节点*/handleNodeClick(data) {// 这里的赋值判断逻辑自定义if (data.children && data.children.length) {return false;}// 赋值this.selectValue = data.id;this.selectlabel = data.name;// 收起下拉框;this.$refs.selectRef.blur();// 收起treeif (this.$refs.treeRef) {const nodes = this.$refs.treeRef.store._getAllNodes();nodes.forEach((node) => {node.expanded = false;});}},/*** 清除*/clearHandle() {this.selectValue = "";this.selectlabel = "";},},watch: {},
};
</script><style lang='scss'>
.custom-el-select-class {.el-select-dropdown__list {height: fit-content;max-height: 274px;.el-select-dropdown__item {height: auto;overflow: visible;padding: 0px 10px;}}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover {background-color: #ffffff;}.special-node {color: red;}
}
</style>

在这里插入图片描述

二、多选

<template><div class="selectTree-wapper"><el-selectv-model="selectlabel"placeholder="请选择"popper-class="custom-el-select-class"ref="selectRef"multiplecollapse-tagsclearable@clear="clearHanlde"@remove-tag="removeTag"style="width: 300px"><el-option :value="selectValue"><el-tree:data="treeData":props="defaultProps"node-key="id"show-checkbox:check-strictly="false":expand-on-click-node="true"ref="treeRef"@check-change="handleCheckChange"><template #default="{ node, data }"><span :class="{ 'special-node': data.id === selectValue }">{{ node.label }}</span></template></el-tree></el-option></el-select></div>
</template><script>
export default {name: "selectTree",components: {},props: {},data() {return {selectlabel: [], // 选项labelselectValue: [], // 选项valuetreeData: [{id: "1",name: "一级 1",children: [{id: "2",name: "二级 1-1",children: [{id: "3",name: "三级 1-1-1",},],},],},{id: "4",name: "一级 2",children: [{id: "5",name: "二级 2-1",children: [{id: "6",name: "三级 2-1-1",},],},{id: "7",name: "二级 2-2",children: [{id: "8",name: "三级 2-2-1",},],},],},],defaultProps: {children: "children",label: "name",},};},mounted() {},methods: {/*** 选择改变*/handleCheckChange() {// 获取所有选中的节点const selectNodes = this.$refs.treeRef.getCheckedNodes();// 只要叶子节点数据const nodes = selectNodes.filter((node) => !(node.children && node.children.length));this.selectValue = nodes.map((node) => node.id);this.selectlabel = nodes.map((node) => node.name);},/*** 清除*/clearHanlde() {this.selectlabel = [];this.selectValue = [];},/*** 移除*/removeTag(tag) {console.log("tag", tag);// 使用 collapse-tags 后,移除的是第一个this.selectValue.shift();this.$nextTick(() => {this.$refs.treeRef.setCheckedKeys(this.selectValue);});},},watch: {},
};
</script><style lang='scss'>
.custom-el-select-class {.el-select-dropdown__list {height: fit-content;max-height: 274px;.el-select-dropdown__item {height: auto;overflow: visible;padding: 0px 10px;}}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover {background-color: #ffffff;}.special-node {color: red;}
}
</style>

在这里插入图片描述

三、单选+懒加载

<template><div class="selectTree-wapper"><el-selectv-model="selectValue"placeholder="请选择"popper-class="custom-el-select-class"><el-option :label="selectlabel" :value="selectValue"><el-tree:props="props":load="loadNode"lazynode-key="id":check-strictly="true":expand-on-click-node="false"@node-click="handleNodeClick"></el-tree></el-option></el-select></div>
</template><script>
export default {name: "selectTree",components: {},props: {},data() {return {selectlabel: "", // 选项labelselectValue: "", // 选项valueprops: {label: "name",children: "children",},};},mounted() {},methods: {/*** 加载节点*/loadNode(node, resolve) {// 第一次请求,默认id为0let id = node.data?.id ? node.data.id : 0;const data = this.getLazyList(id);resolve(data || []);},/*** 请求数据,这里模拟接口返回假数据*/getLazyList(id) {let data = [];if (id !== "3") {data = [{id: "1",name: "节点a",},{id: "2",name: "节点b",},{id: "3",name: "节点c",},];}return data;},/*** 点击节点*/handleNodeClick(data) {this.selectValue = data.id;this.selectlabel = data.name;},},watch: {},
};
</script><style lang='scss'>
.custom-el-select-class {.el-select-dropdown__list {height: fit-content;max-height: 274px;.el-select-dropdown__item {height: auto;overflow: visible;padding: 0px 10px;}}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover {background-color: #ffffff;}
}
</style>

相关文章:

  • AI 检测原创论文:技术迷思与教育本质的悖论思考
  • 部署安装git-2.49.0.tar.xz
  • Profibus DP主站转Modbus RTU/TCP如何把E+H流量计接入到modbus
  • BGP联邦实验
  • 【deekseek】TCP Offload Engine
  • Ozon平台产品关键词优化指南:精准引流与转化提升实战策略
  • 一文辨析Java基本数据类型与包装类
  • Oracle OCP认证考试考点详解083系列15
  • 【Redis】RedLock实现原理
  • Android Native 之 自定义进程
  • C++修炼:继承
  • 【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
  • Springboot | 如何上传文件
  • 算法专题六: 模拟
  • 本地缓存的三种实现
  • Vxe UI vue vxe-table 实现表格数据分组功能,不是使用树结构,直接数据分组
  • 超标量处理器设计5-指令集体系
  • 力扣Hot100(Java版本)
  • upload-labs通关笔记-第3关 文件上传之黑名单绕过
  • 深度Q网络(DQN)的基本概念
  • 国务院关税税则委员会公布公告调整对原产于美国的进口商品加征关税措施
  • 云南威信麟凤镇通报“有人穿‘警察’字样雨衣参与丧事”:已立案查处
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额超5万元
  • 习近平出席中国-拉美和加勒比国家共同体论坛第四届部长级会议开幕式并发表重要讲话
  • 牛市早报|中美日内瓦经贸会谈联合声明公布
  • 人民日报钟声:通过平等对话协商解决分歧的重要一步