什么是递归树状菜单

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

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

<!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门等。通过这些逻辑门的组合,译码器可以实现各种不
1231 0
|
4月前
|
人工智能 移动开发 自然语言处理
万小智官方网站入口链接:阿里云建站、AI建站、网站建设费用价格全解析
万小智是阿里云推出的AI数字员工,集成建站、设计、客服、内容创作于一体,支持对话式建站、AI配图与多语言生成,预置千套模板,可视化拖拽操作,助力企业低成本快速搭建品牌官网。
525 89
|
8月前
|
人工智能 监控 数据可视化
让历史经验自动预警:2025年场景化进度监控工具实践指南
本报告系统梳理进度监控工具四代演进路径,深入解析AI、区块链、联邦学习等技术在智能进度监控系统中的应用,涵盖核心功能模块、可视化分析、主流工具选型及实施方法论,展望下一代技术趋势,助力项目管理智能化转型。
345 0
|
3月前
|
机器学习/深度学习 数据采集 人工智能
零代码基础也能懂的LoRA微调全指南
LoRA(低秩适应)让普通人也能用消费级显卡高效微调大模型。它不改动原模型,仅添加小型“适配模块”,以0.1%-1%的参数量实现接近全量微调的效果,快速打造专属AI助手,推动AI民主化。
302 0
|
6月前
|
JSON API 数据格式
易贝(eBay)item_search 接口对接全攻略:从入门到精通
本文详解eBay开放平台item_search接口的对接全流程,涵盖认证、参数配置、Python代码实现及分页、多站点适配等高级用法,助力开发者高效实现跨境电商选品与市场分析。
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
509 0
|
Java 测试技术 Spring
Java 新手入门:依赖注入的 N 种姿势,总有一款适合你!
Java 新手入门:依赖注入的 N 种姿势,总有一款适合你!
791 2
|
机器学习/深度学习 人工智能 运维
智能化运维:AI在故障预测中的应用
【6月更文挑战第8天】随着人工智能技术的飞速发展,其在IT运维领域的应用也日益广泛。本文将探讨AI技术如何助力运维团队实现故障的智能预测,提高系统稳定性和业务连续性。
通过Golang获取公网IP地址
在Go语言中,获取当前的外网(公网)IP地址可以通过多种方法实现。其中一种常见的方法是通过访问外部服务来获取。这些服务可以返回访问者的公网IP地址,例如 httpbin.org/ip 或 ipify.org。下面是一个简单的例子,展示了如何使用Go标准库中的net/http包和io/ioutil包来实现这一功能。
通过Golang获取公网IP地址
|
存储 数据挖掘 API
确保已经安装了PyPDF2模块。如果没有安装,可以使用pip进行安装:
确保已经安装了PyPDF2模块。如果没有安装,可以使用pip进行安装:

热门文章

最新文章

下一篇
开通oss服务