【DevUI】用于表现层级嵌套结构数据的核心Tree 树组件

前言

本文是关于 DevUI Tree 树组件 的详细使用示例与代码说明总结文章。该组件是基于 Angular ^18.0.0 版本,用于展示层次结构数据,并提供了极其丰富的交互功能。
在这里插入图片描述

1. 组件概述

Tree 树组件是 DevUI 中用于表现层级嵌套结构数据的核心组件。它分为两种:

  • 基础树 (<d-tree>):主要用于数据的层级展示与展开/折叠。
  • 可操作树 (<d-operable-tree>):在基础树之上,集成了节点勾选、编辑、拖拽、搜索等全套交互功能,是功能最全面的版本。

2. 核心功能与代码示例

2.1 基本用法

这是最简单的树,用于渲染一个静态的层级结构。

<!-- 基本树 -->
<d-tree [tree]="basicData" (nodeSelected)="onNodeSelected($event)"></d-tree>

<!-- 自定义缩进(默认为24px) -->
<d-tree [tree]="basicData" [indent]="‘8px‘"></d-tree>

关键点

  • [tree]:绑定树形结构数据。
  • (nodeSelected) / (nodeToggled):监听节点选中和展开/折叠事件。
  • [indent]:控制每一层级的缩进距离。

2.2 可勾选树

使用 <d-operable-tree>,并通过 [checkableRelation] 属性控制复选框的联动逻辑。

<!-- 四种联动关系示例 -->
<d-operable-tree [tree]="data1" [checkableRelation]="‘both‘"></d-operable-tree>
<d-operable-tree [tree]="data2" [checkableRelation]="‘upward‘"></d-operable-tree>
<d-operable-tree [tree]="data3" [checkableRelation]="‘downward‘"></d-operable-tree>
<d-operable-tree [tree]="data4" [checkableRelation]="‘none‘"></d-operable-tree>

联动关系说明

  • both(默认):父子节点状态完全联动。
  • upward:子节点影响父节点(勾选子节点,父节点变为半选或全选)。
  • downward:父节点影响子节点。
  • none:父子节点状态互不影响。

2.3 操作按钮(增删改)

可操作树支持直接在节点上或通过外部按钮进行增、删、改操作。

<d-operable-tree
    #operableTree
    [tree]="data"
    [addable]="true"
    [editable]="true"
    [deletable]="true"
    [beforeDeleteNode]="beforeDeleteNode"
    (nodeEdited)="onNodeEdited($event)">
</d-operable-tree>

<!-- 外部触发操作的按钮 -->
<d-button (click)=“operableTree.addNode(node)”>添加子节点</d-button>
<d-button (click)=“operableTree.editNode(node)”>编辑节点</d-button>
<d-button (click)=“operableTree.deleteNode(node)”>删除节点</d-button>

关键点

  • 通过 [addable], [editable], [deletable] 启用功能。
  • 使用 beforeAddNode/EditNode/DeleteNode 等回调函数进行操作前的拦截或验证。
  • 可通过模板引用变量(如 #operableTree)获取组件实例,以编程方式调用操作。

2.4 搜索与过滤

结合 d-search 组件和 treeFactory 提供的方法,可以实现实时搜索和高亮过滤。

<d-search [placeholder]=“‘搜索节点...‘" (searchFn)=“onSearch($event)”></d-search>
<d-operable-tree #operableTree [tree]=“data”></d-operable-tree>

在组件类中,需要调用 treeFactory.searchTree 方法来处理搜索逻辑,并更新绑定到树的数据。

2.5 自定义图标与节点模板

这是组件高度可定制化的体现,允许你完全控制节点图标、内容以及操作按钮的样式。

<d-operable-tree [tree]="data">
    <!-- 自定义节点前的图标 -->
    <ng-template #iconTemplate let-node=“node”>
        <i [class]=“getIconClass(node)”></i>
    </ng-template>

    <!-- 自定义整个节点的显示内容 -->
    <ng-template #nodeTemplate let-node=“node”>
        <span [class.highlight]=“node.isActive”>{{ node.title }}</span>
        <span class=“custom-badge”>{{ node.count }}</span>
    </ng-template>
</d-operable-tree>

2.6 可拖拽树

通过 [draggable]=“true” 开启拖拽功能,支持树内节点排序和跨树/外部元素拖拽。

<d-operable-tree
    [tree]="data"
    [draggable]="true"
    [dropType]="‘drag insert‘"
    (nodeOnDrop)=“onDrop($event)”>
</d-operable-tree>

关键属性

  • [dropType]:控制拖放类型,如 ‘insert‘(插入)、‘drag insert‘(拖拽插入)等。
  • (nodeDragStart) / (nodeOnDrop):监听拖拽开始和结束事件。

2.7 节点懒加载

对于需要动态加载子节点的大型树,可以使用懒加载优化性能。

<d-tree
    [tree]="lazyLoadData"
    (nodeToggled)=“loadChildren($event)”
    [loadingTemplateRef]=“customLoadingTemplate”>
</d-tree>
<ng-template #customLoadingTemplate>
    <div>正在加载...</div>
</ng-template>

关键点:在 (nodeToggled) 事件中判断节点是否为首次展开,并动态获取其子节点数据后更新树。

2.8 大数据量虚拟滚动

当处理成千上万个节点时,开启虚拟滚动可以避免一次性渲染所有DOM,从而保证性能。

<d-operable-tree
    [tree]="hugeData"
    [virtualScroll]="true"
    [virtualScrollHeight]="‘600px‘"
    [minBufferPx]="600"
    [maxBufferPx]="1200">
</d-operable-tree>

3. 高级配置与工具函数

3.1 自定义数据键名

当你的后端数据字段名与组件默认期望的 (id, title, children) 不一致时,可以自定义映射。

<d-operable-tree
    [tree]="customData"
    [treeNodeIdKey]=“'key'"
    [treeNodeTitleKey]=“'label'"
    [treeNodeChildrenKey]=“'items'">
</d-operable-tree>

3.2 使用 treeFactory 工具函数

treeFactory 提供了一系列强大的工具函数,用于以编程方式操作树的状态。

import { treeFactory } from ‘ng-devui/tree‘;

// 例如:勾选所有节点
checkAllNodes() {
    const treeInstance = this.operableTree.treeFactory;
    treeInstance.checkAllNodes(true); // true为勾选,false为取消
}

// 根据ID获取、激活、隐藏、禁用特定节点
treeInstance.getNodeById(‘nodeId‘);
treeFactory.activeNodeById(‘nodeId‘);
treeFactory.hideNodeById(‘nodeId‘, true);

这些函数使你无需直接操作原始数据,就能高效地控制树的行为。

4. 功能特性速查表

为了帮助您快速找到所需功能,以下是 Tree 组件核心特性的对比:

功能特性适用组件关键属性/方法说明
基础展示<d-tree>[tree], [indent]渲染层级结构,可自定义缩进
节点勾选<d-operable-tree>[checkableRelation]支持四种父子节点勾选联动逻辑
节点操作<d-operable-tree>[addable/editable/deletable], before*回调支持增、删、改及操作前拦截
搜索过滤<d-operable-tree>配合 d-searchtreeFactory.searchTree实现关键词搜索与节点过滤
自定义模板<d-operable-tree>#iconTemplate, #nodeTemplate完全自定义图标、节点内容显示
拖拽排序<d-operable-tree>[draggable]=“true”, [dropType]支持树内及跨区域拖拽
懒加载<d-tree>(nodeToggled) 事件, [loadingTemplateRef]动态展开时加载子节点数据
虚拟滚动<d-operable-tree>[virtualScroll]=“true”, [virtualScrollHeight]优化海量节点渲染性能
数据键映射<d-operable-tree>[treeNode*Key](如 treeNodeIdKey适配自定义数据结构字段名
编程式控制<d-operable-tree>treeFactory 工具函数通过API勾选、展开、禁用节点等

总结

DevUI 的 Tree 组件是一个功能全面、高度可定制且性能强大的企业级组件。对于简单的展示需求,使用 <d-tree> 即可;而对于需要复杂交互(如勾选、编辑、拖拽)的管理后台场景,<d-operable-tree> 几乎提供了开箱即用的全套解决方案。

使用建议

  1. 从数据开始:确保你的数据结构是嵌套的,并了解其键名,必要时使用 [treeNode*Key] 进行映射。
  2. 按需启用功能:根据你的场景,有选择地启用 checkabledraggable 等属性,避免不必要的复杂度。
  3. 善用工具函数:对于程序化控制树的状态(如全选、展开所有),treeFactory 比手动操作数据更方便。
  4. 性能考量:节点数量过多时,优先考虑使用懒加载或开启虚拟滚动

参考文档

MateChat:https://gitcode.com/DevCloudFE/MateChat

MateChat官网:https://matechat.gitcode.com

DevUI官网:https://devui.design/home

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值