vue:下拉树结构,el-select实现

本文介绍如何在Vue.js中使用el-select组件创建一个下拉框,该下拉框展示树形结构的数据。通过隐藏原有选项并自定义样式,结合el-tree组件实现树结构的加载和点击节点的响应。点击树节点时,会将选中值显示在输入框并关闭下拉框,同时清空搜索框内容。实现过程中涉及节点点击回调函数handleNodeClick,用于更新选中值和关闭下拉菜单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下拉框框内显示的选项为树结构加载,效果如下图显示:

在这里插入图片描述
前端html代码

<el-select ref="select" v-model="selectName" placeholder="请选择区域" clearable >
   <div class="put">
     <el-input
       v-model="searchAreaVale"
       placeholder="请输入搜索区域关键字"
       suffix-icon="h-icon-search"
       clearable
       @click="handleIconClick"
     ></el-input>
   </div>
   <el-option key="id" hidden :value="selectVal" :label="selectName" />
   <div class="h-tree">
     <el-tree
       style="padding: 0px 10px 10px 0px"
       :data.sync="optionsMetaAll"
       :props="defaultProps"
       node-key="code"
       parent-key="parentId"
       simple-data
       lazy
       :load="loadTree"
       @node-click="handleNodeClick"
     ></el-tree>
   </div>
 </el-select>

主要实现思路,通过 hidden 去隐藏下来框已有的选项卡,然后再去自定义自己的样式,点击树结构的节点,或者其他操作想收回下拉框时候,调用el-selecthandleClose()函数,即可收回下拉框,我自己的业务逻辑为点击树节点,选中即可收回

/**此操作的回调为树结构的api,不明白可以查看树结构api*/
handleNodeClick(data, node) {
   if (node.isLeaf == false) {
   	return
   }
   /**
   * 将选中的值显示到下拉选择框上,并收回下拉框
   */
   this.selectVal = data.name // select绑定值为点击的选项的value
   this.selectName = data.name // input中显示值为label
   this.treeFilter = '' // 点击后搜索框清空
   this.searchAreaVale = '' //清空搜索项
   this.$refs.select.handleClose() // 点击后关闭下拉框,因为点击树形控件后select不会自动折叠
},
### 如何使用 `el-select` 和 `el-tree` 实现下拉选择树 在实际开发中,当需要实现一个下拉树功能时,可以结合 `el-select` 和 `el-tree` 来完成。以下是一个完整的解决方案和示例代码[^1]。 ```vue <template> <el-select v-model="selectedValue" class="select-unitName select-option-father" popper-class="select_report_and_type" :popper-append-to-body="false" ref="elSelectTable" @visible-change="handleVisibleChange" > <el-option :value="baseTableList"> <el-tree class="unit-tree" :data="treeData" node-key="id" :props="defaultProps" :default-expanded-keys="expandedKeys" ref="unitTree" highlight-current :expand-on-click-node="false" @node-click="handleNodeClick" /> </el-option> </el-select> </template> <script> export default { data() { return { selectedValue: null, 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" } ] } ], expandedKeys: [1, 4], defaultProps: { children: "children", label: "label" } }; }, methods: { handleVisibleChange(visible) { if (visible) { this.$nextTick(() => { const tree = this.$refs.unitTree; if (tree) { tree.setCurrentKey(null); // 清除当前选中状态 } }); } }, handleNodeClick(node) { this.selectedValue = node.label; this.$refs.elSelectTable.blur(); // 关闭下拉框 } } }; </script> <style scoped> .unit-tree { max-height: 200px; overflow-y: auto; } </style> ``` 上述代码实现了以下功能: 1. 使用 `el-select` 作为外层容器,控制下拉框的显示与隐藏。 2. 在 `el-select` 的选项中嵌入 `el-tree` 组件,用于展示树形结构的数据。 3. 通过 `@node-click` 事件监听树节点的点击操作,并将选中的节点值赋值给 `el-select` 的绑定值 `selectedValue`[^1]。 4. 使用 `@visible-change` 监听下拉框的显示状态变化,确保每次打开下拉框时重置树的状态[^2]。 此外,还可以为树形控件添加搜索功能以提升用户体验[^3]。可以通过在 `el-select` 内部添加一个输入框来实现搜索功能。以下是扩展后的代码片段: ```vue <el-input v-if="showSearch" v-model="searchKeyword" placeholder="请输入关键字" style="margin-bottom: 8px;" /> <el-tree :filter-node-method="filterNode" :data="treeData" node-key="id" :props="defaultProps" :default-expanded-keys="expandedKeys" ref="unitTree" highlight-current :expand-on-click-node="false" @node-click="handleNodeClick" /> <script> export default { data() { return { searchKeyword: "", showSearch: false }; }, watch: { searchKeyword(val) { this.$refs.unitTree.filter(val); } }, methods: { filterNode(value, data) { if (!value) return true; return data.label.indexOf(value) !== -1; } } }; </script> ``` #### 注意事项 - 确保 `el-tree` 的数据源是扁平化或层级化的 JSON 数据,并且包含唯一的 `id` 字段。 - 如果需要支持多选功能,可以结合 `el-tree` 的 `setCheckedNodes` 方法实现[^2]。 - 样式部分可以根据实际需求进行调整,例如设置树的高度、滚动条等。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值