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

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 树形菜单拖放功能实现指南
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

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

同类最新

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

更多
CSS3入门指南:常用特性解析与实战练习路径
前端开发 · 2026-09-01

CSS3入门指南:常用特性解析与实战练习路径

CSS3是现代网页开发的核心技术,涵盖圆角、阴影、渐变、过渡、动画及响应式布局等高频特性。本文梳理了CSS3的核心应用场景、分步学习路径与综合练习案例,帮助初学者快速建立从基础排版到现代交互的完整开发思路,并规避常见样式陷阱。

CSS border 边框属性详解:语法、拆分写法与常见问题排查
前端开发 · 2026-09-01

CSS border 边框属性详解:语法、拆分写法与常见问题排查

本文系统讲解CSS标准边框属性border的完整语法结构,涵盖简写与拆分写法、单边控制技巧及border-radius配合方案。针对边框不显示、元素尺寸异常等高频问题提供排查路径,帮助开发者快速掌握边框设置规范并提升界面视觉一致性。

CSS3动画属性有哪些:常用属性与用法说明
前端开发 · 2026-09-01

CSS3动画属性有哪些:常用属性与用法说明

CSS3动画主要分为transition过渡与animation关键帧两类。本文梳理常用属性、简写语法与@keyframes规则,结合悬停、入场、循环等场景给出代码示例与选型建议,帮助开发者快速写出流畅且可控的动画效果。

CSS3渐变色语法与常见用法
前端开发 · 2026-09-01

CSS3渐变色语法与常见用法

CSS3渐变色通过纯代码生成平滑颜色过渡,广泛用于按钮、横幅与卡片背景。本文系统梳理线性与径向渐变的核心语法、方向控制、停靠点设置及多层叠加技巧,提供可直接复用的场景代码,并给出兼容性策略与常见渲染异常排查方法,帮助开发者快速构建稳定、可维护的渐变样式。

CSS3手册中文版下载指南:获取渠道、筛选标准与使用建议
前端开发 · 2026-09-01

CSS3手册中文版下载指南:获取渠道、筛选标准与使用建议

寻找CSS3手册中文版下载资源时,如何判断来源可靠性、筛选高质量内容并有效使用?本文从获取渠道、版本识别、下载验收到替代方案,提供一套可执行的判断标准,帮助你快速找到适合学习或查阅的中文手册。