JavaScript处理多级联动菜单的核心是递归解析树形结构并动态渲染,需适配接口数据格式,支持展开/收起交互与路由跳转,可通过原生递归生成HTML或封装MenuItem类实现状态管理。

JavaScript 处理多级联动菜单数据,核心是递归解析树形结构 + 动态生成 DOM 或响应式模板。关键是把接口返回的嵌套数组(如 children 字段)转化为可遍历、可展开/收起、可点击跳转的菜单节点。
一、确认接口返回的数据结构
典型多级菜单数据是树形结构,常见格式如下:
[
{
"id": 1,
"name": "系统管理",
"path": "/sys",
"children": [
{ "id": 11, "name": "用户管理", "path": "/sys/user" },
{ "id": 12, "name": "角色管理", "path": "/sys/role", "children": [
{ "id": 121, "name": "权限分配", "path": "/sys/role/assign" }
]
}
]
},
{
"id": 2,
"name": "内容管理",
"path": "/content"
}
]
注意:字段名可能不同(如 subMenus、items、nodes),需先统一处理或适配。
二、用递归函数生成 HTML 字符串(适合简单渲染)
适用于静态插入、无需频繁交互的场景。用一个函数自己调自己,逐层拼接 <ul><li>:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 定义递归函数,接收菜单数组和当前层级(可选)
- 对每个菜单项,生成
<li>;若有children,就递归调用并嵌入<ul> - 为有子菜单的项添加折叠标识(如 ▶ / ▼)和 class(如
has-children)
function buildMenuHTML(menus) {
if (!Array.isArray(menus) || menus.length === 0) return '';
return `
<ul class="menu">
${menus.map(item => `
<li data-id="${item.id}">
<a href="${item.path || 'javascript:void(0)'}">${item.name}</a>
${item.children && item.children.length
? `<span class="toggle">▶</span><div class="submenu">${buildMenuHTML(item.children)}</div>`
: ''
}
</li>
`).join('')}
</ul>
`;
}
// 使用
fetch('/api/menu').then(r => r.json()).then(data => {
document.getElementById('menu-container').innerHTML = buildMenuHTML(data);
});
三、用现代框架思路:构建菜单组件(推荐 Vue/React,但纯 JS 也可模拟)
更灵活、易维护的方式是把菜单抽象为“节点对象”,支持展开/收起、选中、高亮等状态:
- 用类(
class MenuItem)封装单个菜单项,含id、name、path、isOpen、children(实例化为 MenuItem 数组) - 提供
toggle()方法控制子菜单显隐 - 用
render()方法返回 DOM 元素(或用document.createElement构建) - 监听点击事件:点击父项时调用
toggle;点击链接时触发跳转或回调
四、绑定交互行为(展开/收起 + 路由跳转)
仅渲染不够,还需响应用户操作:
- 给所有
.toggle元素绑定点击事件,阻止冒泡,调用对应父节点的toggle - 给所有菜单链接绑定点击,可:
– 阻止默认跳转,改用history.pushState或前端路由(如router.push(item.path))
– 触发自定义事件(如new CustomEvent('menu-select', { detail: item }))供外部监听 - 配合 CSS 控制显示/隐藏(如
.submenu { display: none; } .is-open .submenu { display: block; })

















