Layui如何实现导航菜单支持多级树形展开并保持状态

梦枫同学_7653

梦枫同学_7653

2026-07-03

717人浏览

原创

根本原因是Layui 2.4.5版本tree组件不自动维护spread状态,服务端返回数据必须显式包含spread: true且children为空数组或子节点列表,否则节点加载后自动收起。

为什么点击后子节点加载了却自动收起?

根本原因不是 ajax 慢,而是 layui tree 组件在动态更新节点时,不自动继承或维护 spread 状态。你用 tree.update() 或直接重赋 data 后渲染,旧节点的展开态就丢了——哪怕新数据里没写 spread: true,它也默认收着。

尤其在 2.5 以下版本(比如你正在用的 2.4.5),spread 必须显式写死在返回的每个父节点数据里,否则哪怕服务端返回了完整 children 数组,Layui 也不认它是“该展开”的。

  • 服务端返回的父节点数据中,必须包含 spread: true
  • 如果用了 isLazy: true,父节点的 children 字段不能是 null 或缺失,得是空数组 [],否则 Layui 认为“不可展开”
  • 不要在 click 回调里只做 $.get() + tree.update(),漏掉状态同步就必然收起

如何让懒加载节点点开后保持展开?

懒加载(isLazy: true)本身不等于“自动展开”,它只控制是否发起请求;展开动作仍需手动触发或靠数据驱动。关键是在服务端响应里,对刚被点击的父节点,返回带 spread: true 且含子节点的结构。

例如用户点击 ID 为 "node-100" 的节点,后端应返回:

{
  "id": "node-100",
  "name": "系统管理",
  "spread": true,
  "children": [
    { "id": "node-101", "name": "用户管理" },
    { "id": "node-102", "name": "角色管理" }
  ]
}
  • 前端无需额外调用 tree.expand(),只要数据里有 spread: true,Layui 渲染时就会自动展开
  • 若用 tree.update() 手动更新,传入的数据对象也必须带 spread: true,否则状态重置
  • 2.5+ 版本支持 id 定位展开,但前提是节点已存在且 ID 唯一;2.4.5 不支持,老老实实靠数据字段驱动

多级嵌套下如何避免展开错乱或卡顿?

三级以上菜单在低版本 Layui(如 2.4.5)容易交互错乱,不是 bug 是设计限制:早期版本 Tree 组件对深度 >2 的递归渲染和事件绑定不够健壮。

深蓝色网站后台管理系统layui框架模板-AdminPro
深蓝色网站后台管理系统layui框架模板-AdminPro

一款深蓝色网站后台管理系统layui框架模板

下载

实际验证过,2.4.5 对三级节点的 click 事件监听不稳定,常出现点不动、连点两次才响应、或展开后子节点点击失效等问题。

  • 强制升级到 layui.all.js(含完整模块)或至少 2.8+,官方从 2.6 起明确修复多级事件冒泡问题
  • 避免在 nodes 数据里写超过 5 层嵌套,Layui 渲染性能会明显下降,建议后端按需分页或限制深度
  • 如果必须兼容旧版,把“三级及以上”节点设为懒加载(isLazy: true),不一次性全量渲染,减少初始化压力

刷新页面后如何恢复上次展开状态?

Layui tree 本身不记录状态,要持久化展开态,得自己存、自己读。最轻量的做法是用 localStorage 记录已展开节点的 id 列表,初始化时遍历匹配并设 spread: true。

示例逻辑:

const expandedIds = JSON.parse(localStorage.getItem('treeExpanded') || '[]');
const nodes = yourRawData.map(node => {
  if (expandedIds.includes(node.id)) {
    node.spread = true;
  }
  return node;
});
tree.render({ elem: '#menu', nodes });
  • 在 click 回调里,拿到被点击节点的 id,加入 expandedIds 并存入 localStorage
  • 注意去重和清理逻辑,比如用户手动收起时,从数组里删掉对应 id
  • 别用 cookie 存,长度限制严;也别用 sessionStorage,关闭标签页就丢

真正麻烦的不是代码,是“展开态”和“选中态”、“禁用态”混在一起时,状态管理容易漏掉某一项。建议所有状态都统一走一个 stateMap 对象维护,而不是散落在不同字段里。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

layui

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2283

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4903

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6010

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5498

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

783

5

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP配置开发与CMS后台实战
ThinkPHP配置开发与CMS后台实战

共87课时 | 12.7万人学习

第二十三期_综合实战
第二十三期_综合实战

共89课时 | 10.9万人学习

Layui 快速入门精讲
Layui 快速入门精讲

共5课时 | 1.6万人学习