Tree树形控件
想要了解更多关于单独引入组件的内容,可以在快速上手页面进行查看。
最简单的用法,展示可勾选,可选中,禁用,默认展开等功能。
import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';
import { NzFormatEmitEvent, NzTreeComponent, NzTreeNodeOptions } from 'ng-zorro-antd';
@Component({
selector: 'nz-demo-tree-basic',
template: `
<nz-tree
#nzTreeComponent
[nzData]="nodes"
nzCheckable
[nzCheckedKeys]="defaultCheckedKeys"
[nzExpandedKeys]="defaultExpandedKeys"
[nzSelectedKeys]="defaultSelectedKeys"
(nzClick)="nzClick($event)"
(nzCheckBoxChange)="nzCheck($event)"
(nzExpandChange)="nzCheck($event)"
>
</nz-tree>
`
})
export class NzDemoTreeBasicComponent implements OnInit, AfterViewInit {
@ViewChild('nzTreeComponent', { static: false }) nzTreeComponent: NzTreeComponent;
defaultCheckedKeys = ['10020'];
defaultSelectedKeys = ['10010'];
defaultExpandedKeys = ['100', '1001'];
nodes: NzTreeNodeOptions[] = [
{
title: 'parent 1',
key: '100',
children: [
{
title: 'parent 1-0',
key: '1001',
disabled: true,
children: [
{ title: 'leaf 1-0-0', key: '10010', disableCheckbox: true, isLeaf: true },
{ title: 'leaf 1-0-1', key: '10011', isLeaf: true }
]
},
{
title: 'parent 1-1',
key: '1002',
children: [
{ title: 'leaf 1-1-0', key: '10020', isLeaf: true },
{ title: 'leaf 1-1-1', key: '10021', isLeaf: true }
]
}
]
}
];
nzClick(event: NzFormatEmitEvent): void {
console.log(event);
}
nzCheck(event: NzFormatEmitEvent): void {
console.log(event);
}
// nzSelectedKeys change
nzSelect(keys: string[]): void {
console.log(keys, this.nzTreeComponent.getSelectedNodeList());
}
ngOnInit(): void {
// TODO something
}
ngAfterViewInit(): void {
// get node by key: '10011'
console.log(this.nzTreeComponent.getTreeNodeByKey('10011'));
// use tree methods
console.log(
this.nzTreeComponent.getTreeNodes(),
this.nzTreeComponent.getCheckedNodeList(),
this.nzTreeComponent.getSelectedNodeList(),
this.nzTreeComponent.getExpandedNodeList()
);
}
}
将节点拖拽到其他节点内部或前后。
import { Component, OnInit } from '@angular/core';
import { NzFormatEmitEvent } from 'ng-zorro-antd';
@Component({
selector: 'nz-demo-tree-draggable',
template: `
<nz-tree [nzData]="nodes" nzDraggable nzBlockNode (nzOnDrop)="nzEvent($event)"> </nz-tree>
`
})
export class NzDemoTreeDraggableComponent implements OnInit {
nodes = [
{
title: '0-0',
key: '00',
expanded: true,
children: [
{
title: '0-0-0',
key: '000',
expanded: true,
children: [
{ title: '0-0-0-0', key: '0000', isLeaf: true },
{ title: '0-0-0-1', key: '0001', isLeaf: true },
{ title: '0-0-0-2', key: '0002', isLeaf: true }
]
},
{
title: '0-0-1',
key: '001',
children: [
{ title: '0-0-1-0', key: '0010', isLeaf: true },
{ title: '0-0-1-1', key: '0011', isLeaf: true },
{ title: '0-0-1-2', key: '0012', isLeaf: true }
]
},
{
title: '0-0-2',
key: '002'
}
]
},
{
title: '0-1',
key: '01',
children: [
{
title: '0-1-0',
key: '010',
children: [
{ title: '0-1-0-0', key: '0100', isLeaf: true },
{ title: '0-1-0-1', key: '0101', isLeaf: true },
{ title: '0-1-0-2', key: '0102', isLeaf: true }
]
},
{
title: '0-1-1',
key: '011',
children: [
{ title: '0-1-1-0', key: '0110', isLeaf: true },
{ title: '0-1-1-1', key: '0111', isLeaf: true },
{ title: '0-1-1-2', key: '0112', isLeaf: true }
]
}
},
{
title: '0-2',
key: '02',
isLeaf: true
}
];
nzEvent(event: NzFormatEmitEvent): void {
console.log(event);
}
ngOnInit(): void {}
}
带连接线的树。
import { Component, OnInit } from '@angular/core';
import { NzFormatEmitEvent } from 'ng-zorro-antd';
@Component({
selector: 'nz-demo-tree-line',
template: `
<nz-tree [nzData]="nodes" nzShowLine (nzClick)="nzEvent($event)"> </nz-tree>
`
})
export class NzDemoTreeLineComponent implements OnInit {
nodes = [
{
title: 'parent 1',
key: '100',
expanded: true,
children: [
{
title: 'parent 1-0',
key: '1001',
expanded: true,
children: [
{ title: 'leaf', key: '10010', isLeaf: true },
{ title: 'leaf', key: '10011', isLeaf: true },
{ title: 'leaf', key: '10012', isLeaf: true }
]
},
{
title: 'parent 1-1',
key: '1002',
children: [{ title: 'leaf', key: '10020', isLeaf: true }]
},
{
title: 'parent 1-2',
key: '1003',
children: [{ title: 'leaf', key: '10030', isLeaf: true }, { title: 'leaf', key: '10031', isLeaf: true }]
}
]
}
];
nzEvent(event: NzFormatEmitEvent): void {
console.log(event);
}
ngOnInit(): void {}
}
自定义目录树(使用nzTreeTemplate实现,支持右键)。
import { NzContextMenuService, NzDropdownMenuComponent, NzFormatEmitEvent, NzTreeNode } from 'ng-zorro-antd';
@Component({
selector: 'nz-demo-tree-directory',
template: `
<nz-tree [nzData]="nodes" (nzClick)="activeNode($event)" (nzDblClick)="openFolder($event)">
<ng-template #nzTreeTemplate let-node>
<span class="custom-node" [class.active]="activedNode?.key === node.key">
<span *ngIf="!node.isLeaf" (contextmenu)="contextMenu($event, menu)">
<i nz-icon [nzType]="node.isExpanded ? 'folder-open' : 'folder'" (click)="openFolder(node)"></i>
<span class="folder-name">{{ node.title }}</span>
<span class="folder-desc">created by {{ node?.origin?.author | lowercase }}</span>
</span>
<span *ngIf="node.isLeaf" (contextmenu)="contextMenu($event, menu)">
<i nz-icon nzType="file"></i>
<span class="file-name">{{ node.title }}</span>
<span class="file-desc">modified by {{ node?.origin?.author | lowercase }}</span>
</span>
</span>
</ng-template>
</nz-tree>
<nz-dropdown-menu #menu="nzDropdownMenu">
<ul nz-menu>
<li nz-menu-item (click)="selectDropdown()">Action 1</li>
<li nz-menu-item (click)="selectDropdown()">Action 2</li>
</ul>
</nz-dropdown-menu>
`,
styles: [
`
:host ::ng-deep .ant-tree {
overflow: hidden;
margin: 0 -24px;
padding: 0 24px;
}
:host ::ng-deep .ant-tree li {
padding: 4px 0 0 0;
}
.custom-node {
cursor: pointer;
line-height: 24px;
margin-left: 4px;
display: inline-block;
margin: 0 -1000px;
padding: 0 1000px;
}
.active {
background: #1890ff;
color: #fff;
}
.file-name,
.folder-name {
margin-left: 4px;
}
.file-desc,
.folder-desc {
padding: 0 8px;
display: inline-block;
background: #87ceff;
color: #ffffff;
position: relative;
left: 12px;
}
`
]
})
export class NzDemoTreeDirectoryComponent {
// actived node
activedNode: NzTreeNode;
nodes = [
{
title: 'parent 0',
key: '100',
author: 'NG ZORRO',
expanded: true,
children: [
{ title: 'leaf 0-0', key: '1000', author: 'NG ZORRO', isLeaf: true },
{ title: 'leaf 0-1', key: '1001', author: 'NG ZORRO', isLeaf: true }
]
},
{
title: 'parent 1',
key: '101',
author: 'NG ZORRO',
children: [
{ title: 'leaf 1-0', key: '1010', author: 'NG ZORRO', isLeaf: true },
{ title: 'leaf 1-1', key: '1011', author: 'NG ZORRO', isLeaf: true }
]
}
openFolder(data: NzTreeNode | Required<NzFormatEmitEvent>): void {
// do something if u want
if (data instanceof NzTreeNode) {
data.isExpanded = !data.isExpanded;
} else {
const node = data.node;
if (node) {
node.isExpanded = !node.isExpanded;
}
}
}
activeNode(data: NzFormatEmitEvent): void {
this.activedNode = data.node!;
}
contextMenu($event: MouseEvent, menu: NzDropdownMenuComponent): void {
this.nzContextMenuService.create($event, menu);
}
selectDropdown(): void {
// do something
}
constructor(private nzContextMenuService: NzContextMenuService) {}
}
nzBeforeDrop: 在拖拽放置事件(drop事件)之前做校验, 例如仅允许拖拽到内部(延时一秒)、放置前结合modal验证等。
import { Component, OnInit } from '@angular/core';
import { NzFormatBeforeDropEvent } from 'ng-zorro-antd';
import { of, Observable } from 'rxjs';
import { delay } from 'rxjs/operators';
@Component({
selector: 'nz-demo-tree-draggable-confirm',
template: `
<nz-tree [nzData]="nodes" nzDraggable nzBlockNode [nzBeforeDrop]="beforeDrop"> </nz-tree>
`
})
export class NzDemoTreeDraggableConfirmComponent implements OnInit {
nodes = [
{
title: '0-0',
key: '100',
expanded: true,
children: [
{
title: '0-0-0',
key: '1001',
children: [{ title: '0-0-0-0', key: '10010', isLeaf: true }, { title: '0-0-0-1', key: '10011', isLeaf: true }]
},
{
title: '0-0-1',
key: '1002',
children: [{ title: '0-0-1-0', key: '10020', isLeaf: true }]
}
]
}
];
beforeDrop(arg: NzFormatBeforeDropEvent): Observable<boolean> {
// if insert node into another node, wait 1s
if (arg.pos === 0) {
return of(true).pipe(delay(1000));
} else {
return of(false);
}
}
ngOnInit(): void {}
}
可搜索的树。
import { Component, OnInit } from '@angular/core';
import { NzFormatEmitEvent } from 'ng-zorro-antd';
@Component({
selector: 'nz-demo-tree-search',
template: `
<nz-input-group [nzSuffix]="suffixIcon">
<input type="text" nz-input placeholder="Search" [(ngModel)]="searchValue" />
</nz-input-group>
<ng-template #suffixIcon>
<i nz-icon nzType="search"></i>
</ng-template>
<nz-tree
[nzData]="nodes"
[nzSearchValue]="searchValue"
(nzClick)="nzEvent($event)"
(nzExpandChange)="nzEvent($event)"
(nzSearchValueChange)="nzEvent($event)"
>
</nz-tree>
`,
styles: [
`
nz-input-group {
padding: 10px 0;
}
`
]
})
export class NzDemoTreeSearchComponent implements OnInit {
searchValue = '';
nodes = [
{
title: '0-0',
key: '0-0',
children: [
{
title: '0-0-0',
key: '0-0-0',
{ title: '0-0-0-0', key: '0-0-0-0', isLeaf: true },
{ title: '0-0-0-1', key: '0-0-0-1', isLeaf: true },
{ title: '0-0-0-2', key: '0-0-0-2', isLeaf: true }
]
},
{
title: '0-0-1',
key: '0-0-1',
children: [
{ title: '0-0-1-0', key: '0-0-1-0', isLeaf: true },
{ title: '0-0-1-1', key: '0-0-1-1', isLeaf: true },
{ title: '0-0-1-2', key: '0-0-1-2', isLeaf: true }
]
},
{
title: '0-0-2',
key: '0-0-2',
isLeaf: true
}
]
},
{
title: '0-1',
key: '0-1',
children: [
{ title: '0-1-0-0', key: '0-1-0-0', isLeaf: true },
{ title: '0-1-0-1', key: '0-1-0-1', isLeaf: true },
{ title: '0-1-0-2', key: '0-1-0-2', isLeaf: true }
]
},
{
title: '0-2',
key: '0-2',
isLeaf: true
}
];
nzEvent(event: NzFormatEmitEvent): void {
console.log(event);
}
ngOnInit(): void {}
}
方法
方法名 | 说明 | 返回值 |
---|---|---|
getTreeNodes | 获取组件 NzTreeNode 节点 | NzTreeNode[] |
getTreeNodeByKey | 按 key 获取 NzTreeNode 节点 | NzTreeNode |
getCheckedNodeList | 获取组件 checkBox 被点击选中的节点 | NzTreeNode[] |
getSelectedNodeList | 获取组件被选中的节点 | NzTreeNode[] |
getHalfCheckedNodeList | 获取组件半选状态节点 | NzTreeNode[] |
getExpandedNodeList | 获取组件展开状态节点 | NzTreeNode[] |
getMatchedNodeList | 获取组搜索匹配到的节点 | NzTreeNode[] |
NzTreeNodeOptions props
NzFormatEmitEvent props
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
eventName | 事件名 | enum: click dblclick contextmenu check expand search & dragstart dragenter dragover dragleave drop dragend | - |
node | 当前操作节点(拖拽时表示目标节点) | NzTreeNode | null |
event | 原生事件 | 'MouseEvent' | 'DragEvent' | null |
dragNode? | 当前拖拽节点(拖拽时存在) | NzTreeNode | null |
selectedKeys? | 已选中的节点key(单击时存在) | NzTreeNode[] | [] |
checkedKeys? | checkBox 已选中的节点key(点击 checkBox 存在) | NzTreeNode[] | [] |
matchedKeys? | 搜索时匹配到的节点key | NzTreeNode[] | [] |
keys? | 非拖拽事件相关的全部节点的key数组 | string[] | [] |
nodes? | 非拖拽事件相关的全部节点 | NzTreeNode[] | [] |
NzFormatBeforeDropEvent props
NzTreeNode props
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 标题 | string | NzTreeNodeOptions.title |
key | key值 | string | NzTreeNodeOptions.key |
level | 层级(最顶层为0,子节点逐层加1) | number | number |
children | 子节点 | NzTreeNode[] | [] |
origin | 原始节点树结构(用户提供,用于展示额外信息) | NzTreeNodeOptions | - |
getParentNode | 获取父节点 | function | null |
isLeaf | 是否为叶子节点 | boolean | false |
isExpanded | 是否已展开 | boolean | false |
isDisabled | 是否禁用 | boolean | false |
isDisableCheckbox | 是否禁用 checkBox | boolean | false |
isSelectable | 是否可选中 | boolean | true |
isChecked | 是否选中 checkBox | boolean | false |
isHalfChecked | 子节点有选中但未全选 | boolean | false |
isSelected | 是否已选中 | boolean | false |
isLoading | 是否异步加载状态(影响展开图标展示) | boolean | false |
isMatched | title是否包含nzSearchValue(搜索使用) | boolean | false |
setSyncChecked | 设置 checked 状态并同步其他节点状态 | function | - |
getChildren | 获取子节点,返回NzTreeNode数组 | function | - |
addChildren | 添加子节点,接收NzTreeNode或NzTreeNodeOptions数组,第二个参数为插入的索引位置,默认插入末尾 | (children: array, index?: number )=>{} | - |
clearChildren | 清除子节点 | function | - |
remove | 清除当前节点(非根节点) | function | - |
NzTreeNodeOptions
可以接受用户自定义属性,可通过NzTreeNode
的 属性取得。- nzData 属性请传递 NzTreeNodeOptions 数组,传递 NzTreeNode 数组模式将在 8.x 版本取消兼容。