什么是递归树状菜单

简介: 什么是递归树状菜单

三级联动这个功能很酷,里面运用到了递归函数,可以让数据呈树状排序,下面是我写的示例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <body>
    <div id="box">
      <div>
        <span>篮球明星NBA</span>
        <div>
          <span>&nbsp;&nbsp;&nbsp;黑人</span>
          <div>
            <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;科比</span>
            <div></div>
          </div>
          <span>&nbsp;&nbsp;&nbsp;白人</span>
          <div>
            <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;库里</span>
            <div></div>
          </div>
        </div>
      </div>
      <div>
        <span>足球明星</span>
        <div>
          <span>&nbsp;&nbsp;&nbsp;阿根廷</span>
          <div>
            <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;梅西</span>
            <div></div>
          </div>
        </div>
        <div>
          <span>&nbsp;&nbsp;&nbsp;法国</span>
          <div>
            <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;姆巴佩</span>
            <div></div>
          </div>
        </div>
      </div>
      <div>
        <span>兵乒球明星</span>
        <div>
          <span>&nbsp;&nbsp;&nbsp;中国</span>
          <div>
            <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;马龙</span>
            <div></div>
            <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;刘国梁</span>
            <div></div>
            <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;张继科</span>
            <div></div>
          </div>
        </div>
      </div>
    </div>
    <script src="index.js"></script>
  </body>
</html>

上面是基本样式,大家可以自己调一下;

let arr1 = [{
  "name":"篮球明星NBA",
  "id":"1",
  "pid":"0"
},
{
  "name":"黑人",
  "id":"2",
  "pid":"1"
},
{
  "name":"白人",
  "id":"3",
  "pid":"1"
},
{
  "name":"科比",
  "id":"4",
  "pid":"2"
},
{
  "name":"库里",
  "id":"5",
  "pid":"3"
},
{
  "name":"足球明星",
  "id":"6",
  "pid":"0"
},
{
  "name":"阿根廷",
  "id":"7",
  "pid":"6"
},
{
  "name":"法国",
  "id":"8",
  "pid":"6"
},
{
  "name":"梅西",
  "id":"9",
  "pid":"7"
},
{
  "name":"姆巴佩",
  "id":"10",
  "pid":"8"
},
{
  "name":"兵乒球明星",
  "id":"11",
  "pid":"0"
},
{
  "name":"中国",
  "id":"12",
  "pid":"11"
},
{
  "name":"马龙",
  "id":"13",
  "pid":"12"
},
{
  "name":"刘国梁",
  "id":"14",
  "pid":"12"
},
{
  "name":"张继科",
  "id":"15",
  "pid":"12"
}
]
//创建一个函数 treeData(把data传过来、pid、空数组arr){
function treeData(data,pid,arr){
  for(let i = 0;i<data.length;i++){
    if(data[i].pid == pid){
      arr.push(data[i]);
    }
  }
  for(let i = 0;i<arr.length;i++){
    arr[i].children = treeData(data,arr[i].id,[])
  }
  return arr;
}
  //for循环(循环data){
    //if判断(data数据传过来的pid是否等于当前数据pid 0){
      //将符合条件的数据放到数组arr里;
    //}
  //}
  //for循环(循环数组arr){
    //数组arr的下标i等于渲染函数treeData(data,数组arr的下标id、空数组[]);
  //}
  //返回数组arr;
//}
 
//声明一个全局变量newwData 让它的值等于treeData;
let newwData = treeData(arr1,0,[]);
//声明一个空字符串 str;
let str = '';
//渲染函数 vray;
//创建一个函数(data){
function vray(data){
  for(let i = 0;i<data.length;i++){
    str += `<div><span>${data[i].name}</span><div style="display:none;">`;
    if(data[i].children.length > 0){
      vray(data[i].children)
    }
    str += `</div></div>`;
  }
}
vray(newwData);
document.getElementById('box').innerHTML = str;
  //for循环(data){
    //str拼接;
    //if判断(data[i].children.length > 0){
      //调用渲染函数vray(data[i].children);
    //}
    //str拼接结束标签</div>;
  //}
  //调用渲染函数;vray(newData);
  //将box渲染到页面上;
//}
 
 
//事件委托addEventListener
//box.addEventListener('click',function(e){
document.getElementById('box').addEventListener('click',function(e){
  e = event || window.event;
  let self =  e.srcElement || e.target;
  if(self.nextElementSibling.style.display =='none'){
    self.nextElementSibling.style.display ='block';
  }else{
    self.nextElementSibling.style.display ='none';
  }
});
  //做兼容(e = event || window.event);
  //声明一个全局变量 self 让它的值等于 e.sicElement || e.target;
  //if判断(self.nextElemrntSibling.style.display =='none'){
    //self.nextElemrntSibling.style.display ='block';
  //}else{
    //self.nextElemrntSibling.style.display ='none';
  //}
//})

这是写在js里的执行操作,这里面运用到了事件委托!

它只能在js里绑定,否则在其它地方获取不到他。

相关文章
|
芯片
译码器的介绍
译码器是一种常见的数字电路元件,它用于将输入的编码信号转换为输出的解码信号。在数字系统中,译码器起着非常重要的作用,它能够将编码的数字信号转换为可识别的输出信号,实现数字信号的解码和解析。本文将介绍译码器的原理、分类、应用以及未来的发展趋势。 一、译码器的原理 译码器的原理是基于布尔逻辑运算的。它根据输入的编码信号,通过内部的逻辑门电路进行运算,最终输出对应的解码信号。译码器的输入可以是二进制编码、BCD编码或格雷码等形式,输出可以是十进制数、BCD数或具体的控制信号等。 译码器的内部结构通常由多个逻辑门电路组成,例如AND门、OR门和NOT门等。通过这些逻辑门的组合,译码器可以实现各种不
964 0
|
存储 前端开发 Java
SpringMVC中重定向请求时传输参数原理分析与实践
SpringMVC中重定向请求时传输参数原理分析与实践
439 2
SpringMVC中重定向请求时传输参数原理分析与实践
|
文字识别 算法 数据挖掘
视觉智能开放平台产品使用合集之对于统计研究和数据分析,有哪些比较好的工具推荐
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
192 0
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
282 0
|
Java 测试技术 Spring
Java 新手入门:依赖注入的 N 种姿势,总有一款适合你!
Java 新手入门:依赖注入的 N 种姿势,总有一款适合你!
471 2
|
机器学习/深度学习 人工智能 运维
智能化运维:AI在故障预测中的应用
【6月更文挑战第8天】随着人工智能技术的飞速发展,其在IT运维领域的应用也日益广泛。本文将探讨AI技术如何助力运维团队实现故障的智能预测,提高系统稳定性和业务连续性。
|
存储 数据挖掘 API
确保已经安装了PyPDF2模块。如果没有安装,可以使用pip进行安装:
确保已经安装了PyPDF2模块。如果没有安装,可以使用pip进行安装:
通过Golang获取公网IP地址
在Go语言中,获取当前的外网(公网)IP地址可以通过多种方法实现。其中一种常见的方法是通过访问外部服务来获取。这些服务可以返回访问者的公网IP地址,例如 httpbin.org/ip 或 ipify.org。下面是一个简单的例子,展示了如何使用Go标准库中的net/http包和io/ioutil包来实现这一功能。
通过Golang获取公网IP地址
|
SQL JSON API
接口设计的18条军规
本文介绍了接口设计的18条最佳实践,包括签名防止数据篡改、加密敏感信息、IP白名单增强安全性、限流保护服务、统一返回值结构、异常统一处理、请求日志记录、幂等性设计、限制请求记录条数、压力测试、异步处理、数据脱敏、完整接口文档、合理使用请求方式、利用请求头传递参数、设计批量操作接口和职责单一原则。这些规则旨在确保API接口的安全、稳定、高效和易于维护。
230 3
|
SQL 存储 前端开发
JAVA中怎样实现树形菜单
在这篇文章中,作者介绍了如何用两种方法实现目录树数据结构。首先,定义了目录结构在实际开发中的作用,即后端向前端返回整理好的数据,类似书目录的形式。接着,作者逐步讲解了实现目录树的步骤,包括创建数据表、插入数据、创建对象类以及编写逻辑代码。在逻辑代码部分,提供了两种写法,一种适合新手理解,另一种简洁但可能对初学者较难。每种写法都包含了获取数据、转换数据、构建树结构和获取顶层节点的过程。最后,展示了实现后的目录树结构数据。
279 2