【免费下载链接】element A Vue.js 2.0 UI Toolkit for Web 项目地址: https://gitcode.com/gh_mirrors/eleme/element
在现代Web应用开发中,层级数据选择是常见需求,如组织架构选择、分类目录筛选等场景。Element UI作为基于Vue.js 2.0的UI组件库,虽然未提供独立的TreeSelect组件,但通过el-tree与el-select的组合,可实现灵活高效的树形选择功能。本文将系统讲解层级选择的实现方案,从基础架构到高级特性,帮助开发者构建符合业务需求的树形选择器。
Element UI的树形选择功能核心依赖于Tree组件,其内部采用组件化设计,由以下核心模块构成:
TreeStore数据层:model/tree-store.js实现树形数据的加载、节点管理和状态维护,支持异步加载和动态更新TreeNode视图层:tree-node.vue负责单个节点的渲染,包含展开/折叠控制、复选框状态和拖拽交互TreeController控制层:tree.vue处理用户交互事件,协调数据层与视图层的通信组件的数据流采用单向绑定模式,通过props接收配置和数据,通过events触发状态变更,核心数据流如下:
使用原生Tree组件实现基础的层级选择功能,核心配置如下:
<template> <el-tree :data="treeData" show-checkbox node-key="id" ref="tree" @check-change="handleCheckChange"> </el-tree> </template> <script> export default { data() { return { treeData: [ { id: 1, label: '一级节点', children: [ { id: 11, label: '二级节点' }, { id: 12, label: '二级节点' } ] } ] }; }, methods: { handleCheckChange(node, checked, indeterminate) { // 获取所有选中节点 const checkedNodes = this.$refs.tree.getCheckedNodes(); console.log('选中节点:', checkedNodes); } } }; </script>
vue
关键属性说明:
show-checkbox: 显示复选框,支持多选node-key: 设置节点唯一标识字段default-expanded-keys: 默认展开节点ID数组check-strictly: 禁用父子节点关联勾选 2. 下拉树形选择器结合Select组件实现下拉式树形选择,点击输入框展开树形结构:
<template> <el-select v-model="selectedLabel" placeholder="请选择" @click.native="visible = true"> <el-option :value="selectedValue" style="display:none;"></el-option> </el-select> <el-popover v-model="visible" placement="bottom-start" width="300"> <el-tree :data="treeData" node-key="id" @node-click="handleNodeClick"> </el-tree> </el-popover> </template> <script> export default { data() { return { visible: false, selectedValue: null, selectedLabel: '', treeData: [] // 树形数据 }; }, methods: { handleNodeClick(node) { this.selectedValue = node.id; this.selectedLabel = node.label; this.visible = false; } } }; </script>
vue
对于大数据量的层级结构,使用懒加载提升性能,配置如下:
<el-tree :data="treeData" node-key="id" lazy :load="loadNode" show-checkbox> </el-tree> <script> export default { methods: { loadNode(node, resolve) { // 根节点加载 if (node.level === 0) { return resolve([{ id: 1, label: '加载中...', isLeaf: false }]); } // 异步加载子节点 this.$api.get(`/api/children/${node.data.id}`) .then(response => { resolve(response.data.map(item => ({ ...item, isLeaf: item.level >= 3 // 三级节点为叶子节点 }))); }); } } }; </script>
vue
2. 拖拽排序功能通过启用draggable属性实现节点拖拽,结合tree-node-drag-end事件处理排序逻辑:
<el-tree :data="treeData" node-key="id" draggable @node-drop="handleDrop"> </el-tree> <script> export default { methods: { handleDrop(draggingNode, dropNode, dropType) { // 拖拽完成后的处理逻辑 this.$api.post('/api/sort', { draggedId: draggingNode.data.id, targetId: dropNode.data.id, position: dropType // 'before' | 'after' | 'inner' }); } } }; </script>
vue
3. 自定义节点内容使用scoped slot自定义节点渲染内容,支持复杂UI展示:
<el-tree :data="treeData" node-key="id"> <template slot-scope="{ node, data }"> <span class="custom-tree-node"> <span>{{ node.label }}</span> <el-button type="text" size="mini" @click="() => appendNode(data)"> 添加子节点 </el-button> </span> </template> </el-tree>
vue
对于包含1000+节点的大型树形结构,建议采用以下优化方案:
虚拟滚动:使用height属性限制可视区域,Tree组件会自动启用虚拟滚动
<el-tree :data="bigData" height="400px"></el-tree>
vue
节点过滤优化:使用filter-node-method实现高效节点搜索
<el-input v-model="filterText"></el-input> <el-tree :data="treeData" :filter-node-method="filterNode" ref="tree"> </el-tree> <script> export default { watch: { filterText(val) { this.$refs.tree.filter(val); } }, methods: { filterNode(value, data) { if (!value) return true; return data.label.includes(value); } } }; </script>
vue
数据缓存策略:在TreeStore层实现节点数据缓存,避免重复请求
使用setCheckedNodes方法实现表单编辑场景的勾选状态回显:
mounted() {
this.$api.get('/api/get-checked-ids').then(ids => {
this.$refs.tree.setCheckedNodes(
ids.map(id => this.findNodeById(id))
);
});
},
methods: {
findNodeById(id) {
const findNode = (nodes) => {
for (const node of nodes) {
if (node.id === id) return node;
if (node.children) {
const found = findNode(node.children);
if (found) return found;
}
}
return null;
};
return findNode(this.treeData);
}
}
javascript
运行
2. 父子节点关联逻辑通过check-strictly属性控制父子节点关联关系:
<!-- 完全独立勾选 --> <el-tree check-strictly></el-tree> <!-- 半关联模式(自定义实现) --> <el-tree :data="data" show-checkbox @check-change="handleCheckChange"> </el-tree> <script> export default { methods: { handleCheckChange(node, checked) { // 实现自定义关联逻辑 if (checked) { // 勾选时自动勾选父节点 this.checkParentNodes(node); } else { // 取消勾选时自动取消子节点 this.uncheckChildNodes(node); } } } }; </script>
vue
典型应用场景:企业管理系统中的部门/人员选择,结合多选+级联勾选功能
<template> <div class="org-selector"> <el-tree :data="orgData" show-checkbox node-key="id" :check-strictly="false" @check-change="handleCheckChange"> </el-tree> <div class="selected-result"> 已选: {{ selectedDepartments.length }}个部门, {{ selectedUsers.length }}位用户 </div> </div> </template>
vue
2. 分类目录选择器电商平台中的商品分类选择,支持多级分类和部分选择:
<el-tree :data="categoryData" show-checkbox default-expand-all :props="{ label: 'name', children: 'subCategories' }"> </el-tree>
vue
将树形选择功能封装为独立组件,方便项目复用:
<!-- components/TreeSelect.vue --> <template> <div class="el-tree-select"> <!-- 封装后的树形选择器 --> </div> </template> <script> import { Tree, Input, Popover } from 'element-ui'; export default { name: 'ElTreeSelect', components: { ElTree, ElInput, ElPopover }, props: { // 定义组件属性 value: [String, Number, Array], data: { type: Array, required: true }, multiple: { type: Boolean, default: false } }, // 实现组件逻辑 }; </script>
vue
2. 样式定制通过覆盖Element的CSS变量自定义树形组件样式:
.el-tree {
--el-tree-node-indent: 24px;
.el-tree-node__content {
height: 40px;
}
.el-tree-node__label {
color: var(--el-text-color-primary);
&:hover {
color: var(--el-color-primary);
}
}
}
scss
Element UI的Tree组件虽然不是专门的TreeSelect组件,但通过灵活组合和二次开发,完全能够满足大多数层级选择场景需求。核心优势在于:
功能完备:支持勾选、拖拽、懒加载等20+特性性能优异:虚拟滚动和高效数据处理支持万级节点扩展性强:丰富的事件和插槽支持深度定制随着Vue 3生态的发展,建议关注Element Plus的TreeSelect组件,它提供了更原生的树形选择体验。对于仍在使用Vue 2的项目,本文介绍的实现方案可以作为稳定可靠的替代方案。
完整的实现示例可参考官方文档examples/docs/zh-CN/tree.md,更多高级用法可查阅组件测试用例。
【免费下载链接】element A Vue.js 2.0 UI Toolkit for Web 项目地址: https://gitcode.com/gh_mirrors/eleme/element
相关知识
jQuery MiniUI 开发教程 表单控件 TreeSelect:树形选择框(十三)
使用第三方图标库拓展Element UI的图标库
【Vue 快速入门】从零开始搭建 VUE + Element UI后台管理系统框架
三种方法构建Java树形结构,Stream真的厉害
后台管理系统的开源方案推荐:精选14个优质项目
打造出色 UI 界面:深入了解 UI 设计的 10 大核心原则
UI色彩搭配方案,B端设计师干货纯享!
jQuery MiniUI 开发教程 树形控件 创建树:树形结构(一)
动态引入阿里图标库 · 工作篇 · 看云
Element Plus
网址: Element UI树形选择:TreeSelect层级选择方案 https://m.huajiangbk.com/newsview2489512.html
| 上一篇: Android实现多级树形选择列 |
下一篇: element下拉树形选择框 |