游乐游手机版
首页/前端开发/文章详情

jQuery EasyUI 树形菜单:利用 loadFilter 加载父/子节点数据

时间:2026-08-31 11:33
本文详解如何在 jQuery EasyUI 中使用 loadFilter 选项,将包含 parentId 的平铺数据转换为标准的树形菜单格式。通过具体代码示例,展示如何遍历数据并构建父子层级关系,解决直接加载邻接列表模型数据的问题。

本文详解如何在 jQuery EasyUI 中使用 loadFilter 选项,将包含 parentId 的平铺数据转换为标准的树形菜单格式。通过具体代码示例,展示如何遍历数据并构建父子层级关系,解决直接加载邻接列表模型数据的问题。

最终效果预览

jQuery EasyUI 树形菜单加载后的层级结构展示,包含Foods、Fruits、Vegetables等节点及其子项
加载完成后的树形菜单结构,清晰展示父节点与子节点的层级关系

在使用 jQuery EasyUI 的 Tree 组件时,通常后端返回的数据是平铺的列表形式(即邻接列表模型),每个节点存储一个 parentId 来表示其父级。直接加载这种数据会导致树形菜单无法正确显示层级关系。我们需要在加载前将其转换为标准的树形数据格式(包含 children 数组)。

前置准备与数据格式说明

在开始编码之前,需要明确原始数据的结构。通常这种数据被称为“邻接列表模型”,其特点如下:

  • 每个节点包含 id(唯一标识)和 parentId(父节点ID)。
  • 根节点的 parentId 通常为 0null
  • 数据以数组形式平铺返回,而非嵌套结构。

以下是一个典型的父/子节点数据示例(注意:原文中第一个对象存在拼写错误 parendId,实际代码中应统一使用 parentId):

[  {"id":1,"parentId":0,"name":"Foods"},  {"id":2,"parentId":1,"name":"Fruits"},  {"id":3,"parentId":1,"name":"Vegetables"},  {"id":4,"parentId":2,"name":"apple"},  {"id":5,"parentId":2,"name":"orange"},  {"id":6,"parentId":3,"name":"tomato"},  {"id":7,"parentId":3,"name":"carrot"},  {"id":8,"parentId":3,"name":"cabbage"},  {"id":9,"parentId":3,"name":"potato"},  {"id":10,"parentId":3,"name":"lettuce"}]

配置 loadFilter 加载树形菜单

EasyUI Tree 插件提供了一个 loadFilter 选项,它允许我们在数据到达组件之前对其进行自定义处理。这是实现平铺数据转树形结构的关键。

第1步:初始化 Tree 并指定 loadFilter

在初始化 #tt 元素时,通过 url 指定数据源,并定义 loadFilter 函数。该函数接收原始数据数组,并返回转换后的树形数据。

$('#tt').tree({  url: 'data/tree6_data.json',  loadFilter: function(rows){    return convert(rows);  }});

这里调用了自定义的 convert 函数,该函数负责将平铺数组重组为嵌套对象。

实现数据转换逻辑

convert 函数的核心逻辑分为两步:首先找出所有根节点(即没有父节点或父节点ID为0的节点),然后递归地(通过迭代方式)将子节点挂载到对应的父节点下。

第2步:编写 convert 转换函数

以下是完整的转换实现代码,包含详细注释:

function convert(rows) {  // 辅助函数:检查 parentId 是否存在于 rows 中  function exists(rows, parentId) {    for(var i=0; i

逻辑解析

  • 查找根节点:通过 exists 函数判断每个节点的 parentId 是否在其他节点的 id 中存在。如果不存在,则该节点为根节点。
  • 构建层级:使用一个队列 toDo 存储待处理的节点。初始时将所有根节点加入队列。
  • 迭代挂载:从队列中取出一个节点,遍历原始数据找到所有以该节点 idparentId 的子节点,并将它们添加到父节点的 children 数组中。随后将这些子节点也加入队列,以便继续查找它们的子节点。
  • 返回结果:当队列为空时,所有节点均已处理完毕,返回构建好的 nodes 数组。

常见问题与调整

1. 数据字段名不一致

表现:树形菜单无法显示或显示为空。

原因:后端返回的字段名与前端代码中使用的 parentId 不一致(如原文示例中的 parendId 拼写错误)。

解决方法:确保后端返回的 JSON 数据中,父节点标识字段统一为 parentId,或者在 convert 函数中根据实际字段名进行调整。

2. 性能问题

表现:数据量较大时,页面加载缓慢。

原因:当前的 exists 函数和内部循环使用了线性搜索,时间复杂度为 O(N^2)。

解决方法:对于大数据量,建议在后端直接返回树形结构,或者在前端使用哈希表(对象映射)将 id 到节点的映射关系建立起来,将查找时间复杂度降低至 O(1)。

总结

通过 jQuery EasyUI 的 loadFilter 选项,我们可以灵活地处理各种数据格式。本文介绍的 convert 函数提供了一种通用的方法,将平铺的邻接列表数据转换为树形菜单所需的嵌套结构。这种方法适用于大多数需要展示层级关系且后端数据为平铺结构的场景。

以上就是 jQuery EasyUI 树形菜单利用 loadFilter 加载父/子节点的详细内容,更多关于 jQuery EasyUI 树形菜单的资料请关注本站其它相关文章!

来源:https://www.runoob.com/jeasyui/jeasyui-tree-tree6.html
上一篇jQuery EasyUI 树形网格(TreeGrid)基础创建教程 下一篇jQuery EasyUI 树形菜单拖放功能实现指南
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
HTML超链接标签详解:语法、属性与样式
前端开发 · 2026-08-31

HTML超链接标签详解:语法、属性与样式

本文系统讲解HTML中标签的语法结构、核心属性(href与target)及浏览器默认样式。通过代码示例与属性对照表,帮助开发者掌握链接目标设置、窗口打开方式控制及链接状态样式原理,为网页导航与交互开发提供基础依据。

CSS链接样式:4种伪类选择器详解与示例
前端开发 · 2026-08-31

CSS链接样式:4种伪类选择器详解与示例

本文详解CSS中用于控制链接样式的四种伪类选择器::link、:visited、:hover和:active。通过完整示例代码与运行效果演示,帮助开发者掌握链接状态样式的定义方法,并理解伪类书写顺序规则,避免样式覆盖问题。

CSS margin(外边距)属性详解与折叠机制
前端开发 · 2026-08-31

CSS margin(外边距)属性详解与折叠机制

本文系统讲解CSS margin属性的设置方法、取值规则与简写语法,重点剖析相邻兄弟元素与父子元素之间的外边距折叠机制。通过完整示例与图示,帮助开发者准确控制元素间距,避免布局错位,并补充现代CSS实践建议。

CSS计数器精讲:属性语法、嵌套用法与实战示例
前端开发 · 2026-08-31

CSS计数器精讲:属性语法、嵌套用法与实战示例

CSS计数器通过counter-reset、counter-increment和content属性实现纯CSS自动编号。本文详解初始化、自增、显示与嵌套逻辑,提供完整代码示例与注意事项,帮助开发者在不依赖JavaScript的情况下快速生成章节序号、列表编号等结构化内容。

CSS 渐变色(颜色渐变)10分钟入门
前端开发 · 2026-08-31

CSS 渐变色(颜色渐变)10分钟入门

本文系统讲解 CSS3 中的四种渐变类型:线性渐变、径向渐变、圆锥渐变及重复渐变。通过语法解析、参数说明与完整 HTML 示例代码,帮助开发者快速掌握渐变色的创建方法,并了解其在实际网页设计中的应用技巧。