js的递归函数——实现可收放的树形菜单

前言

树形菜单是一种常见的网站导航方式,它通常由多个层级的菜单项组成,每个菜单项可以有子菜单项。在JavaScript中,我们可以使用递归函数来实现树形菜单。
树形菜单就是这样的东西,点击上一级,显示下一级,无限循环,一直逐层显示下一级。再次点击,关闭下一级。长的很像树,故名树形菜单。学会这个东西,是不是很酷?
在这里插入图片描述


树形菜单的作用

树形菜单的主要作用是将信息层次化,将复杂的信息结构变得更加清晰和直观。它通常用于展示层级关系比较复杂的数据,如文件目录、网站导航、商品分类等。树形菜单的优点包括:

  1. 层次化展示:树形菜单可以将信息按照层级展示,使用户能够更加清晰地理解信息之间的关系。

  2. 简洁明了:树形菜单的结构简单明了,能够有效地减少信息的冗余,提高页面的整体美观度。

  3. 交互性强:树形菜单可以通过展开和收起节点的方式,使用户能够更加方便地获取所需信息。

  4. 可扩展性好:树形菜单可以根据需要随时添加新的节点,具有很好的扩展性。


创建假数据或者请求接口数据

首先,我们需要一个数据结构来表示树形菜单,通常可以使用嵌套的对象或数组来表示。每个菜单项包含以下属性:

下面是一个假数据:

			const menu = [{
					label: '家人',
					children: [{
						label: '爹妈',
						children: [{
							label: '我',
							children: []
						}]
					}]
				},
				{
					label: '老师',
					children: [{
							label: '物理老师',
							children: [{
								label: '物理老师儿子',
								children: []
							}]
						},
						{
							label: '化学老师',
							children: [{
								label: '化学老师儿子',
								children: []
							}]
						}
					]
				},
				{
					label: '老板',
					children: [{
						label: '总经理',
						children: [{
								label: '领导1',
								children: [{
									label: '韩国分公司',
									children: []
								}]
							},
							{
								label: '领导2',
								children: [{
									label: '日本分公司',
									children: []
								}]
							}
						]
					}]
				}
			];

定义递归函数,处理数据

接下来,我们可以定义一个递归函数来遍历这个数据源,并且为每个菜单项添加点击事件。

下面是一个递归函数实现:

			function createMenu(menuData) {
				const menuEl = document.createElement('ul');

				menuData.forEach(item => {
					const itemEl = document.createElement('li');
					const labelEl = document.createElement('span');
					labelEl.innerText = item.label;
					itemEl.appendChild(labelEl);

					if (item.children.length > 0) {
						labelEl.addEventListener('click', () => {
							if (itemEl.classList.contains('open')) {
								itemEl.classList.remove('open');
								itemEl.removeChild(itemEl.lastChild);
							} else {
								itemEl.classList.add('open');
								const submenuEl = createMenu(item.children);
								itemEl.appendChild(submenuEl);
							}
						});
					}
					menuEl.appendChild(itemEl);
				});
				return menuEl;
			}

调用函数,渲染页面

最后,我们可以调用这个函数来生成完整的树形菜单的HTML代码:

			const menuEl = createMenu(menu);
			document.body.appendChild(menuEl);

这里假设树形菜单的容器元素的ID为menu。我们先取出这个元素,然后将生成的HTML代码插入到这个元素的innerHTML属性中,即可显示出树形菜单。


效果展示

在这里插入图片描述


完整代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title></title>
		<script src="./js/jquery-3.6.1.js"></script>
		<style></style>
	</head>
	<body>
		<script>
			const menu = [{
					label: '家人',
					children: [{
						label: '爹妈',
						children: [{
							label: '我',
							children: []
						}]
					}]
				},
				{
					label: '老师',
					children: [{
							label: '物理老师',
							children: [{
								label: '物理老师儿子',
								children: []
							}]
						},
						{
							label: '化学老师',
							children: [{
								label: '化学老师儿子',
								children: []
							}]
						}
					]
				},
				{
					label: '老板',
					children: [{
						label: '总经理',
						children: [{
								label: '领导1',
								children: [{
									label: '韩国分公司',
									children: []
								}]
							},
							{
								label: '领导2',
								children: [{
									label: '日本分公司',
									children: []
								}]
							}
						]
					}]
				}
			];

			function createMenu(menuData) {
				const menuEl = document.createElement('ul');

				menuData.forEach(item => {
					const itemEl = document.createElement('li');
					const labelEl = document.createElement('span');
					labelEl.innerText = item.label;
					itemEl.appendChild(labelEl);

					if (item.children.length > 0) {
						labelEl.addEventListener('click', () => {
							if (itemEl.classList.contains('open')) {
								itemEl.classList.remove('open');
								itemEl.removeChild(itemEl.lastChild);
							} else {
								itemEl.classList.add('open');
								const submenuEl = createMenu(item.children);
								itemEl.appendChild(submenuEl);
							}
						});
					}

					menuEl.appendChild(itemEl);
				});

				return menuEl;
			}

			const menuEl = createMenu(menu);
			document.body.appendChild(menuEl);
		</script>
	</body>
</html>


  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
树形菜单是一种常见的网页导航结构,其层级关系类似树状结构,可以通过递归函数实现递归函数是一种自我调用的函数,在树形菜单中,递归函数可以用来遍历菜单的层级结构,并展示相应的菜单项。 在JavaScript中,可以使用递归函数实现树形菜单。首先,我们需要一个菜单的数据结构,通常是一个包含多个对象的数组。每个对象表示一个菜单项,包含以下属性:id(唯一标识符)、name(菜单名称)、children(子菜单项)等。 接下来,我们可以定义一个递归函数,传入一个菜单项和父元素的DOM节点作为参数。函数首先创建一个菜单项的DOM节点,并将其添加到父元素中。然后,递归调用该函数来处理子菜单项,将当前菜单项作为父元素,并将子菜单项传入作为参数,直到所有的菜单项都被处理完成。 具体实现过程如下: function createMenu(menu, parentElement) { for(let i = 0; i < menu.length; i++) { const menuItem = menu[i]; const menuItemElement = document.createElement('li'); menuItemElement.innerHTML = menuItem.name; parentElement.appendChild(menuItemElement); if(menuItem.children) { const subMenuElement = document.createElement('ul'); menuItemElement.appendChild(subMenuElement); createMenu(menuItem.children, subMenuElement); } } } // 调用递归函数 const menuData = [ { id: 1, name: '菜单1', children: [ { id: 2, name: '菜单1-1', children: [ { id: 3, name: '菜单1-1-1' }, { id: 4, name: '菜单1-1-2' } ] }, { id: 5, name: '菜单1-2' } ] }, { id: 6, name: '菜单2' } ]; const menuElement = document.getElementById('menu'); createMenu(menuData, menuElement); 通过以上代码,我们可以实现一个基本的树形菜单递归函数的核心思想是在处理每个菜单项时,判断是否存在子菜单,若存在,则创建一个相应的DOM节点,并将其添加到当前菜单项的DOM节点中,然后继续递归调用该函数处理子菜单项,以此类推。这样可以实现对任意层级的树形菜单的创建和展示。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猫娃来啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值