mcpField
S
syncfusion-javascript-treeview

syncfusion-javascript-treeview

github.com/syncfusion开发065 次安装1 周前更新
代码仓库

关于 syncfusion-javascript-treeview

syncfusion-javascript-treeview 是实现 Syncfusion TypeScript TreeView 组件的技能,面向需要展示和管理层级数据的开发者,涵盖数据绑定、选择、节点操作及无障碍配置。

主要功能

  1. 01绑定层级数据和远程数据
  2. 02支持单选及多选节点
  3. 03添加、删除、更新和移动节点
  4. 04支持复选框与行内编辑
  5. 05自定义节点模板和外观
  6. 06启用按需加载和键盘导航

适用场景

  1. 01展示文件夹或分类层级
  2. 02通过复选框选择多个节点
  3. 03通过拖放重新组织节点
  4. 04按需加载子节点

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/syncfusion/javascript-ui-controls-skills --skill syncfusion-javascript-treeview

安装后在 Claude Code 中输入/syncfusion-javascript-treeview确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
accessibility-and-advanced.md
customization-and-styling.md
data-binding.md
getting-started.md
node-editing-and-interaction.md
node-manipulation.md
node-selection-and-checking.md

详细介绍

实现 Syncfusion TypeScript TreeView — 完整指南

TreeView 组件是一个功能强大的导航控件,可将层级数据以树形结构展示,并提供数据绑定、多选、复选框、节点编辑、拖放和可自定义模板等高级功能。


何时使用此技能

在以下情况下使用此技能:

  • 以树形结构展示层级数据(文件夹、类别、组织结构图)
  • 启用用户选择,支持单选或多选节点模式
  • 添加复选框,以支持带有父子关系的多选场景
  • 动态操作节点(在运行时添加、删除、更新和移动节点)
  • 编辑节点文本,支持内联编辑和验证
  • 自定义外观,包括模板、自定义图标和样式
  • 处理用户交互,例如点击、展开/折叠和键盘导航
  • 高效加载数据,支持延迟加载和远程数据源
  • 实现无障碍功能,例如键盘快捷键和 ARIA 支持
  • 拖放节点以重新组织层级结构

控件概览

TreeView 支持:

  • 数据绑定: 层级数据、自引用数据和远程数据源
  • 选择模式: 单选、多选、复选框选择
  • 节点操作: 添加、删除、更新、刷新和移动节点
  • 事件: 点击、选择、勾选、展开、折叠、编辑、按键(共 20 个事件)
  • 自定义: 模板、图标、样式、主题、RTL 支持
  • 性能: 默认启用延迟加载(按需加载)
  • 无障碍功能: 键盘导航、ARIA 属性、屏幕阅读器支持

快速入门

import { enableRipple } from '@syncfusion/ej2-base';
import { TreeView } from '@syncfusion/ej2-navigations';
enableRipple(true);

// Define hierarchical data
let treeData = [
    {
        nodeId: '01',
        nodeText: 'Documents',
        nodeChild: [
            { nodeId: '01-01', nodeText: 'Reports.pdf' },
            { nodeId: '01-02', nodeText: 'Proposals.docx' }
        ]
    },
    {
        nodeId: '02',
        nodeText: 'Images',
        expanded: true,
        nodeChild: [
            { nodeId: '02-01', nodeText: 'photo1.jpg' },
            { nodeId: '02-02', nodeText: 'photo2.jpg' }
        ]
    }
];

// Initialize TreeView
let treeView = new TreeView({
    fields: {
        dataSource: treeData,
        id: 'nodeId',
        text: 'nodeText',
        child: 'nodeChild'
    }
});

treeView.appendTo('#tree');

核心概念

数据绑定类型
  1. 层级数据 — 嵌套的子对象
  2. 自引用数据 — 通过父级 ID 引用的扁平数组
  3. 远程数据 — 使用 OData、Web API 或自定义适配器的 DataManager
选择模式
  1. 单选 — 默认模式,每次选择一个节点
  2. 多选 — 使用 Ctrl/Cmd 单击选择多个节点
  3. 复选框 — 使用可视复选框进行多选
节点状态
  • 已展开 — 子节点可见
  • 已折叠 — 子节点隐藏
  • 已选择 — 用户已选择
  • 已勾选 — 复选框已勾选
  • 已禁用 — 交互已禁用

完整 API 参考

属性(共 31 项)
数据与绑定属性

1. fields(FieldsSettingsModel) 指定 TreeView 节点的数据源和字段映射。

let treeView = new TreeView({
    fields: {
        dataSource: data,
        id: 'nodeId',
        text: 'nodeText',
        child: 'nodeChild',
        parentID: 'pid',
        hasChildren: 'hasChild',
        expanded: 'isExpanded',
        selected: 'isSelected',
        isChecked: 'checked',
        tooltip: 'tooltipText',
        iconCss: 'icon',
        imageUrl: 'image',
        htmlAttributes: 'attrs',
        navigateUrl: 'url',
        selectable: 'isSelectable'
    }
});

2. selectedNodes(string[],默认值:[]) 表示当前已选择节点的 ID 数组。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    selectedNodes: ['01', '02']  // Pre-select nodes
});

// Get selected nodes
console.log(treeView.selectedNodes);  // ['01', '02']

// Set selected nodes programmatically
treeView.selectedNodes = ['03', '04'];
treeView.dataBind();

3. checkedNodes(string[],默认值:[]) 表示当前已勾选节点的 ID 数组。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    showCheckBox: true,
    checkedNodes: ['01', '03']  // Pre-check nodes
});

// Get checked nodes
console.log(treeView.checkedNodes);

4. expandedNodes(string[],默认值:[]) 表示已展开节点的 ID 数组。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    expandedNodes: ['01', '02']  // Expand specific nodes
});

5. showCheckBox(boolean,默认值:false) 在 TreeView 中显示复选框,以支持多选。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    showCheckBox: true  // Enable checkboxes
});
状态和行为属性

6. disabled (boolean,默认值:false) 禁用所有 TreeView 交互。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    disabled: false  // Set to true to disable
});

// Enable/disable dynamically
treeView.disabled = true;
treeView.dataBind();

7. allowDragAndDrop (boolean,默认值:false) 启用节点的拖放功能。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    allowDragAndDrop: true  // Enable drag-drop
});

8. allowEditing (boolean,默认值:false) 启用节点文本的内联编辑。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    allowEditing: true  // Enable inline editing
});

9. allowMultiSelection (boolean,默认值:false) 启用使用 Ctrl/Cmd 多选节点。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    allowMultiSelection: true
});

10. allowTextWrap (boolean,默认值:false) 允许节点文本换行显示。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    allowTextWrap: true
});

11. autoCheck (boolean,默认值:true) 选中父节点时,自动选中或取消选中父节点和子节点。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    showCheckBox: true,
    autoCheck: true  // Parent-child auto-check enabled
});

12. checkDisabledChildren (boolean,默认值:true) 选中父节点时,选中已禁用的子节点。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    showCheckBox: true,
    checkDisabledChildren: true
});

13. checkOnClick (boolean,默认值:false) 点击节点文本时选中或取消选中节点(而不只是点击复选框)。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    showCheckBox: true,
    checkOnClick: true  // Click text to check/uncheck
});

14. fullRowSelect (boolean,默认值:true) 选中整行,而不只是文本。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    fullRowSelect: true  // Full row is selectable
});

15. fullRowNavigable (boolean,默认值:false) 使用方向键导航整行,而不只是文本。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    fullRowNavigable: true
});

16. loadOnDemand (boolean,默认值:true) 按需(展开节点时)延迟加载子节点。

let treeView = new TreeView({
    fields: {
        dataSource: data,
        id: 'id',
        text: 'name',
        child: 'child',
        hasChildren: 'hasChild'
    },
    loadOnDemand: true  // Load children on expand
});
展开和交互属性

17. expandOn (ExpandOnSettings,默认值:'Auto') 展开或折叠节点的操作:Auto、Click、DblClick、None。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    expandOn: 'Click'  // Single click to expand, double click to collapse
});

18. sortOrder (SortOrder,默认值:'None') 节点的排序顺序:None、Ascending、Descending。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    sortOrder: 'Ascending'  // Sort nodes alphabetically
});

19. dragArea (HTMLElement | string,默认值:null) 用于限制拖放操作的目标元素。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    allowDragAndDrop: true,
    dragArea: '#dragContainer'  // Restrict drag to this element
});
外观和 HTML 属性

20. animation (NodeAnimationSettingsModel) 展开/折叠的动画设置。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    animation: {
        expand: {
            effect: 'SlideDown',
            duration: 400,
            easing: 'linear'
        },
        collapse: {
            effect: 'SlideUp',
            duration: 400,
            easing: 'linear'
        }
    }
});

21. cssClass (string,默认值:'') 用于设置 TreeView 样式的自定义 CSS 类。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    cssClass: 'custom-tree'  // Apply custom CSS
});

// CSS
// .custom-tree .e-text-content { color: #333; font-weight: bold; }

22. nodeTemplate (string | Function,默认值:null) 用于渲染节点的自定义模板。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    nodeTemplate: '<div class="node-content">${name}</div>'
});

// Or with function
let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    nodeTemplate: (data) => {
        return `<div class="custom"><span>${data.name}</span></div>`;
    }
});

23. disableHtmlEncode (boolean,默认值:true) 在节点中渲染原始 HTML,不进行编码。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    disableHtmlEncode: true  // Render HTML tags
});

24. enableHtmlSanitizer (boolean,默认值:true) 对不可信 HTML 进行清理,以确保安全。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    enableHtmlSanitizer: true  // Sanitize HTML
});
配置和持久化属性

25. enableRtl (boolean,默认值:false) 针对 RTL 语言进行从右到左的渲染。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    enableRtl: true  // Enable RTL layout
});

26. enablePersistence (boolean,默认值:false) 在页面重新加载期间保留 TreeView 状态(选中、展开、勾选)。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    enablePersistence: true  // Persist state
});

其他属性(27-31):

  • allowKeyboardNavigation(boolean)- 启用键盘快捷键
  • locale(string)- 本地化
  • selectedNode(string)- 单个选中的节点
  • edit - 编辑配置
  • contextMenu - 上下文菜单项

方法(共 22 个)
节点导航和可见性

1. ensureVisible(node: string | Element): void 通过展开祖先节点并滚动到该节点,使其可见。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' }
});
treeView.appendTo('#tree');

// Make node 05-02 visible
treeView.ensureVisible('05-02');  // Expands all parent nodes and scrolls to view

2. getNode(node: string | Element): { [key: string]: Object } 按 ID 或元素获取节点,并返回 DOM 节点元素。

// Get node by ID
let nodeElement = treeView.getNode('01-01');

// Get node by element
let element = document.getElementById('node1');
let nodeData = treeView.getNode(element);

3. getTreeData(node?: string | Element): { [key: string]: Object }[] 获取更新后的 TreeView 数据。如果传入 ID,则返回该节点的数据。传入空字符串则返回所有数据。

// Get all tree data
let allData = treeView.getTreeData('');
console.log(allData);  // Array of all nodes

// Get specific node data
let nodeData = treeView.getTreeData('01');
console.log(nodeData);  // [{ id: '01', name: 'Documents', child: [...] }]

// Get child nodes
let childData = treeView.getTreeData('01');
console.log(childData[0].child);  // Array of child nodes
节点操作(添加/移除/移动)

4. addNodes(nodes: { [key: string]: Object }[], target?: string | Element, index?: number, preventTargetExpand?: boolean): void 向 TreeView 添加新节点。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' }
});
treeView.appendTo('#tree');

// Add nodes to a parent (will be added as children)
treeView.addNodes([
    { id: '03-01', name: 'New Item 1' },
    { id: '03-02', name: 'New Item 2' }
], '03');

// Add at specific index
treeView.addNodes([{ id: '03-03', name: 'Item at index 0' }], '03', 0);

// Add without expanding parent
treeView.addNodes([{ id: '04-01', name: 'Hidden' }], '04', null, true);

5. removeNodes(nodes: string[] | Element[]): void 从 TreeView 移除节点。

// Remove by ID
treeView.removeNodes(['01-01', '01-02']);

// Remove by element
let element = document.querySelector('[data-uid="01-01"]');
treeView.removeNodes([element]);

6. moveNodes(sourceNodes: string[] | Element[], target: string | Element, index: number, preventTargetExpand?: boolean): void 将节点移动到其他父节点下或其他位置。

// Move nodes to new parent
treeView.moveNodes(['01-01', '01-02'], '03');

// Move to specific index in target
treeView.moveNodes(['01-01'], '03', 0);

// Move without expanding target
treeView.moveNodes(['01-01'], '04', null, true);

7. refreshNode(target: string | Element, newData: { [key: string]: Object }[]): void 刷新/更新节点内容。

// Refresh node with new data
treeView.refreshNode('01', { id: '01', name: 'Updated Documents', child: [] });

// Refresh display without data change
treeView.refreshNode('01');
节点状态管理

8. expandAll(nodes?: string[] | Element[], level?: number, excludeHiddenNodes?: boolean, preventAnimation?: boolean): void 展开所有节点或指定节点。

// Expand all nodes
treeView.expandAll();

// Expand specific nodes
treeView.expandAll(['01', '02', '03']);

// Expand to specific level
treeView.expandAll(null, 2);  // Expand 2 levels deep

// Expand without animation
treeView.expandAll(null, null, false, true);

9. collapseAll(nodes?: string[] | Element[], level?: number, excludeHiddenNodes?: boolean): void 折叠所有节点或指定节点。

// Collapse all nodes
treeView.collapseAll();

// Collapse specific nodes
treeView.collapseAll(['01', '02']);

// Collapse to specific level
treeView.collapseAll(null, 1);

10. checkAll(nodes?: string[] | Element[]): void 勾选所有节点或指定节点(复选框)。

// Check all nodes
treeView.checkAll();

// Check specific nodes
treeView.checkAll(['01', '02', '03']);

11. uncheckAll(nodes?: string[] | Element[]): void 取消勾选所有节点或指定节点。

// Uncheck all nodes
treeView.uncheckAll();

// Uncheck specific nodes
treeView.uncheckAll(['01', '02']);

12. getAllCheckedNodes(): string[] 获取包含子节点在内的所有已勾选节点 ID 数组。

let checkedNodeIds = treeView.getAllCheckedNodes();
console.log(checkedNodeIds);  // ['01', '01-01', '02', '02-01', '02-02']

13. getDisabledNodes(): string[] 获取所有已禁用节点 ID 数组。

let disabledNodeIds = treeView.getDisabledNodes();
console.log(disabledNodeIds);  // ['03', '04-01']
编辑方法

14. beginEdit(node: string | Element): void 开始节点的内联编辑模式。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    allowEditing: true
});
treeView.appendTo('#tree');

// Start editing node
treeView.beginEdit('01');  // Node becomes editable

15. updateNode(target: string | Element, newText: string): void 更新/重命名节点文本。

// Update node text
treeView.updateNode('01', 'Documents (Updated)');

// Or with data object
treeView.updateNode('01', { id: '01', name: 'New Name' });
启用/禁用方法

16. enableNodes(nodes: string[] | Element[]): void 启用之前已禁用的节点。

// Enable specific nodes
treeView.enableNodes(['01', '02']);

17. disableNodes(nodes: string[] | Element[]): void 禁用节点(阻止交互)。

// Disable specific nodes
treeView.disableNodes(['03', '04']);  // These nodes can't be clicked/selected
组件生命周期方法

18. appendTo(selector?: string | HTMLElement): void 将 TreeView 添加到 DOM 元素。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' }
});

// Append to element with ID
treeView.appendTo('#tree');

// Or append to element reference
treeView.appendTo(document.getElementById('tree'));

19. dataBind(): void 立即应用待处理的属性更改。

treeView.selectedNodes = ['01', '02'];
treeView.dataBind();  // Apply changes immediately

20. refresh(): void 刷新控件并应用待处理的更改。

treeView.fields.dataSource = newData;
treeView.refresh();  // Refresh with new data

21. destroy(): void 移除组件并分离所有事件。

// Clean up TreeView
treeView.destroy();

其他方法(22):

  • getRootElement(): HTMLElement - 获取根 DOM 元素
  • Inject(moduleList: Function[]) - 动态注入模块

事件(共 20 个)
生命周期事件

1. created TreeView 成功创建时触发。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    created: () => {
        console.log('TreeView created!');
    }
});

2. destroyed TreeView 销毁时触发。

treeView.destroyed = () => {
    console.log('TreeView destroyed!');
};
数据事件

3. dataBound TreeView 中填充数据时触发。

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    dataBound: (args) => {
        console.log('Data bound to TreeView');
    }
});

4. dataSourceChanged 数据发生更改时触发(添加、移除、移动等操作之后)。

treeView.dataSourceChanged = (args: DataSourceChangedEventArgs) => {
    console.log('Action:', args.action);  // 'add', 'remove', 'move', etc.
    console.log('Updated data:', args.data);
};

5. actionFailure 任何操作失败时触发。

treeView.actionFailure = (args: FailureEventArgs) => {
    console.error('Error:', args.error);
};
节点选择事件

6. nodeSelecting 选择节点之前触发。

treeView.nodeSelecting = (args: NodeSelectEventArgs) => {
    console.log('Node selecting:', args.nodeData.name);
    if (args.nodeData.id === 'protect-this') {
        args.cancel = true;  // Prevent selection
    }
};

7. nodeSelected 选择/取消选择节点之后触发。

treeView.nodeSelected = (args: NodeSelectEventArgs) => {
    console.log('Node selected:', args.nodeData.name);
    console.log('Action:', args.action);  // 'select' or 'unselect'
    console.log('Interacted:', args.isInteracted);
};

8. nodeClicked 点击节点时触发。

treeView.nodeClicked = (args: NodeClickEventArgs) => {
    console.log('Node clicked:', args.nodeData.name);
    console.log('Event:', args.event);  // Original click event
};
节点勾选事件

9. nodeChecking 勾选/取消勾选节点之前触发。

treeView.nodeChecking = (args: NodeCheckEventArgs) => {
    console.log('Node checking:', args.nodeData.name);
    console.log('Action:', args.action);  // 'check' or 'uncheck'
    
    // Prevent checking specific nodes
    if (args.nodeData.id === 'read-only') {
        args.cancel = true;
    }
};

10. nodeChecked 勾选/取消勾选节点之后触发。

treeView.nodeChecked = (args: NodeCheckEventArgs) => {
    console.log('Node checked:', args.nodeData.name);
    console.log('All checked nodes:', treeView.getAllCheckedNodes());
};
节点展开/折叠事件

11. nodeExpanding 展开节点之前触发。

treeView.nodeExpanding = (args: NodeExpandEventArgs) => {
    console.log('Node expanding:', args.nodeData.name);
    
    // Prevent expansion
    if (args.nodeData.locked) {
        args.cancel = true;
    }
};

12. nodeExpanded 节点成功展开之后触发。

treeView.nodeExpanded = (args: NodeExpandEventArgs) => {
    console.log('Node expanded:', args.nodeData.name);
};

13. nodeCollapsing 折叠节点之前触发。

treeView.nodeCollapsing = (args: NodeExpandEventArgs) => {
    console.log('Node collapsing:', args.nodeData.name);
};

14. nodeCollapsed 折叠节点之后触发。

treeView.nodeCollapsed = (args: NodeExpandEventArgs) => {
    console.log('Node collapsed:', args.nodeData.name);
};
节点编辑事件

15. nodeEditing 编辑节点文本之前触发。

treeView.nodeEditing = (args: NodeEditEventArgs) => {
    console.log('Node editing:', args.oldText);
    
    // Prevent editing
    if (args.nodeData.locked) {
        args.cancel = true;
    }
};

16. nodeEdited 节点文本成功编辑之后触发。

treeView.nodeEdited = (args: NodeEditEventArgs) => {
    console.log('Old text:', args.oldText);
    console.log('New text:', args.newText);
    console.log('Inner HTML:', args.innerHtml);
};
拖放事件

17. nodeDragStart 开始拖动节点时触发。

treeView.nodeDragStart = (args: DragAndDropEventArgs) => {
    console.log('Drag started:', args.draggedNodeData.name);
    console.log('Dragged node element:', args.draggedNode);
};

18. nodeDragging 拖动节点期间持续触发。

treeView.nodeDragging = (args: DragAndDropEventArgs) => {
    console.log('Dragging...');
    console.log('Current drop target:', args.dropTarget);
    
    // Prevent dropping on specific nodes
    if (args.dropTarget.classList.contains('no-drop')) {
        args.dropIndicator = 'e-no-drop';
    }
};

19. nodeDragStop 停止拖动节点时触发。

treeView.nodeDragStop = (args: DragAndDropEventArgs) => {
    console.log('Drag stopped');
    console.log('Drop position:', args.position);  // 'Inside', 'Before', 'After'
};

20. nodeDropped 成功放置节点时触发。

treeView.nodeDropped = (args: DragAndDropEventArgs) => {
    console.log('Dropped on:', args.dropTarget);
    console.log('New drop index:', args.dropIndex);
    console.log('Drop position:', args.position);
};
其他事件

21. drawNode 渲染节点之前触发。

22. keyPress 在聚焦的节点上按下键盘按键时触发。


事件参数

所有事件都提供详细的参数对象:

事件参数类关键属性
dataBoundDataBoundEventArgsdata
dataSourceChangedDataSourceChangedEventArgsaction, data, nodeData
actionFailureFailureEventArgserror
nodeSelecting/nodeSelectedNodeSelectEventArgsaction, cancel, isInteracted, node, nodeData
nodeClickedNodeClickEventArgsevent, node
nodeChecking/nodeCheckedNodeCheckEventArgsaction, cancel, data, isInteracted, node
nodeExpanding/nodeExpanded/etcNodeExpandEventArgscancel, isInteracted, node, nodeData
nodeEditing/nodeEditedNodeEditEventArgscancel, innerHtml, newText, node, nodeData, oldText
nodeDragStart/Dragging/Stop/DroppedDragAndDropEventArgscancel, clonedNode, draggedNode, draggedNodeData, dropIndex, dropIndicator, dropLevel, dropTarget, droppedNode, droppedNodeData, event, position, preventTargetExpand, target

配置模型
FieldsSettingsModel

将数据源字段映射到 TreeView:

let fields = {
    dataSource: dataArray,          // Array or DataManager
    id: 'nodeId',                  // ID field
    text: 'nodeText',              // Display text field
    child: 'nodeChild',            // Child nodes field (hierarchical)
    parentID: 'parentId',          // Parent ID field (self-referential)
    hasChildren: 'hasChild',       // Boolean field for has children
    expanded: 'isExpanded',        // Expansion state field
    selected: 'isSelected',        // Selection state field
    isChecked: 'checked',          // Checkbox state field
    iconCss: 'icon',               // Icon CSS class field
    imageUrl: 'image',             // Image URL field
    tooltip: 'tooltipText',        // Tooltip field
    htmlAttributes: 'attrs',       // HTML attributes field
    navigateUrl: 'url',            // Navigation URL field
    selectable: 'isSelectable',    // Selectable field
    query: new Query()             // DataManager query
};
NodeAnimationSettingsModel
let animation = {
    expand: {
        effect: 'SlideDown',       // Animation effect
        duration: 400,             // Duration in ms
        easing: 'linear'           // Easing function
    },
    collapse: {
        effect: 'SlideUp',
        duration: 400,
        easing: 'linear'
    }
};
ExpandOnSettings(枚举)
  • Auto(默认)- 双击展开
  • Click - 单击
  • DblClick - 双击
  • None - 不通过点击展开
SortOrder(枚举)
  • None(默认)- 不排序
  • Ascending - 按 A-Z 排序
  • Descending - 按 Z-A 排序

数据绑定策略

完整的数据绑定指南请参阅 references/data-binding.md,其中包括:

  • 层级数据绑定
  • 自引用绑定
  • 使用 DataManager 处理远程数据
  • 延迟加载配置

节点选择与勾选

请参阅 references/node-selection-and-checking.md,了解:

  • 单选和多选模式
  • 复选框配置
  • 自动勾选行为
  • 选择事件

节点操作(CRUD)

请参阅 references/node-manipulation.md,了解:

  • 动态添加节点
  • 删除节点
  • 更新/刷新节点
  • 移动节点
  • 批量操作

节点编辑与交互

请参阅 references/node-editing-and-interaction.md,了解:

  • 内联编辑节点
  • 验证
  • 点击处理器
  • 键盘导航

自定义与样式

请参阅 references/customization-and-styling.md,了解:

  • 节点模板
  • 自定义图标
  • CSS 样式
  • 基于层级的自定义
  • 手风琴模式
  • 主题

高级功能

请参阅 references/accessibility-and-advanced.md,了解:

  • 拖放
  • 筛选和搜索
  • 排序
  • 上下文菜单
  • 无障碍功能

常见模式

模式 1:简单文件浏览器
let fileData = [
    { id: 1, name: 'Documents', hasChild: true },
    { id: 2, pid: 1, name: 'Reports.pdf' },
    { id: 3, pid: 1, name: 'Budget.xlsx' },
    { id: 4, name: 'Images', hasChild: true },
    { id: 5, pid: 4, name: 'Photos', hasChild: true },
    { id: 6, pid: 5, name: 'Vacation.jpg' }
];

let treeView = new TreeView({
    fields: { dataSource: fileData, id: 'id', text: 'name', parentID: 'pid', hasChildren: 'hasChild' }
});
treeView.appendTo('#tree');
模式 2:带复选框的多选
let data = [
    { id: 1, name: 'Fruits', hasChild: true },
    { id: 2, pid: 1, name: 'Apple' },
    { id: 3, pid: 1, name: 'Banana' },
    { id: 4, name: 'Vegetables', hasChild: true },
    { id: 5, pid: 4, name: 'Carrot' }
];

let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', parentID: 'pid', hasChildren: 'hasChild' },
    showCheckBox: true,
    autoCheck: true
});
treeView.appendTo('#tree');

document.getElementById('getChecked').addEventListener('click', () => {
    let checkedNodes = treeView.getAllCheckedNodes();
    console.log('Selected items:', checkedNodes);
});
模式 3:带验证的可编辑树
let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    allowEditing: true,
    nodeEditing: (args) => {
        // Validate during editing
        if (args.newText.length < 3) {
            args.cancel = true;
            alert('Name must be at least 3 characters');
        }
    },
    nodeEdited: (args) => {
        console.log(`Renamed: "${args.oldText}" → "${args.newText}"`);
    }
});
treeView.appendTo('#tree');

document.getElementById('editBtn').addEventListener('click', () => {
    let selectedNode = treeView.selectedNodes[0];
    if (selectedNode) {
        treeView.beginEdit(selectedNode);
    }
});
模式 4:动态添加/移除
let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' }
});
treeView.appendTo('#tree');

document.getElementById('addBtn').addEventListener('click', () => {
    let parent = treeView.selectedNodes[0] || '1';
    treeView.addNodes([
        { id: Date.now(), name: 'New Item' }
    ], parent);
});

document.getElementById('removeBtn').addEventListener('click', () => {
    let selected = treeView.selectedNodes;
    if (selected.length > 0) {
        treeView.removeNodes(selected);
    }
});
模式 5:拖放
let treeView = new TreeView({
    fields: { dataSource: data, id: 'id', text: 'name', child: 'child' },
    allowDragAndDrop: true,
    nodeDragStart: (args) => {
        console.log('Started dragging:', args.draggedNodeData.name);
    },
    nodeDragging: (args) => {
        // Prevent dropping on readonly nodes
        if (args.dropTarget?.classList.contains('readonly')) {
            args.dropIndicator = 'e-no-drop';
        }
    },
    nodeDropped: (args) => {
        console.log(`Moved "${args.draggedNodeData.name}" to new parent`);
    }
});
treeView.appendTo('#tree');

故障排除与常见问题

问:TreeView 未显示数据?

  • 答:确保字段映射与数据结构一致。检查 id、text 和 child/parentID 字段是否正确。

问:父/子节点自动勾选不起作用?

  • 答:设置 autoCheck: true,并确保已启用 showCheckBox: true。

问:大型数据集存在性能问题?

  • 答:使用 loadOnDemand: true 进行延迟加载。这样只有在展开时才会加载子节点。

问:事件未触发?

  • 答:确保在添加到 DOM 之前设置事件处理器。动态设置时使用 addEventListener。

问:如何持久化选中状态?

  • 答:设置 enablePersistence: true,将状态保存到浏览器存储中。

问:拖放不起作用?

  • 答:设置 allowDragAndDrop: true,并确保节点具有正确的 ID。

文档链接

核心设置与配置
功能参考文件重点
快速入门getting-started.md安装、设置、基本初始化、依赖项、主题、快速示例
数据与绑定
功能参考文件重点
数据绑定data-binding.md层级数据、自引用数据、远程/OData 服务、DataManager、延迟加载、最佳实践
选择与交互
功能参考文件重点
节点选择与勾选node-selection-and-checking.md单选/多选、复选框、自动勾选行为、选择事件、键盘快捷键
节点编辑与交互node-editing-and-interaction.md行内编辑、验证、点击处理程序、键盘导航、高级交互
操作与处理
功能参考文件重点
节点操作(CRUD)node-manipulation.md添加、移除、更新、移动节点,获取节点数据,批量操作
外观与样式
功能参考文件重点
自定义与样式customization-and-styling.mdCSS 类、主题、模板、基于层级的样式、图标、复选框、RTL 支持
高级功能
功能参考文件重点
高级功能与无障碍支持accessibility-and-advanced.md拖放、筛选、排序、上下文菜单、键盘导航、ARIA、性能优化

元数据

  • 版本:1.0.0
  • API 覆盖率:31 个属性 + 22 个方法 + 20 个事件(100%)
  • 代码示例:60 多个经验证的示例
  • Utils 集成:涵盖 25/25 个主题
  • 参考文件:7 份综合指南
  • 目录:14 个章节及其子章节
  • 最后更新:2026-03-27
  • 质量:可用于生产 ✅

评论

支持 Markdown