js(递归函数)实现树型菜单

简介: js(递归函数)实现树型菜单

效果图:

先创建一个JSON文件

[
  {
    "name":"一级菜单1",
    "child":[
      {
        "name":"二级菜单1-1"
      },{
        "name":"二级菜单1-2",
        "child":[
          {
            "name":"三级菜单1-2-1"
          },{
            "name":"三级菜单1-2-2"
          },{
            "name":"三级菜单1-2-3"
          }
        ]
      },{
        "name":"二级菜单1-3"
      }
    ]
  },{
    "name":"一级菜单2",
    "child":[
      {
        "name":"二级菜单2-1"
      },{
        "name":"二级菜单2-2",
        "child":[
          {
            "name":"三级菜单2-2-1"
          },{
            "name":"三级菜单2-2-2"
          },{
            "name":"三级菜单2-2-3"
          }
        ]
      },{
        "name":"二级菜单2-3"
      }
    ]
  },{
    "name":"一级菜单3",
    "child":[
      {
        "name":"二级菜单3-1"
      },{
        "name":"二级菜单3-2",
        "child":[
          {
            "name":"三级菜单3-2-1"
          },{
            "name":"三级菜单3-2-2"
          },{
            "name":"三级菜单3-2-3"
          }
        ]
      },{
        "name":"二级菜单3-3"
      }
    ]
  },{
    "name":"一级菜单4",
    "child":[
      {
        "name":"二级菜单4-1"
      },{
        "name":"二级菜单4-2",
        "child":[
          {
            "name":"三级菜单4-2-1"
          },{
            "name":"三级菜单4-2-2"
          },{
            "name":"三级菜单4-2-3"
          }
        ]
      },{
        "name":"二级菜单4-3"
      }
    ]
  },{
    "name":"一级菜单5",
    "child":[
      {
        "name":"二级菜单5-1"
      },{
        "name":"二级菜单5-2",
        "child":[
          {
            "name":"三级菜单5-2-1"
          },{
            "name":"三级菜单5-2-2"
          },{
            "name":"三级菜单5-2-3"
          }
        ]
      },{
        "name":"二级菜单5-3"
      }
    ]
  }
]

js部分

<script>
      // ajax请求JSON文件
      let xhr = new XMLHttpRequest();
      // 创建 XMLHttpRequest 对象
      xhr.open('get', 'js/index.json', true);
      // 使用 open 方法指定要请求的地址、类型和方式。
      xhr.send();
      // 使用 send 方法发送请求,如果需要传参:
      // get 方式要将参数拼接到 URL 后边,参数间&分割。例:’index.php?name=张三&age=18’ 
      // post 方式可以将参数放到 send()里。例:send(‘name=张三&age=18’)
      xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
          // 绑定 onreadystatechange 事件,判断 readyState 和 status 的状态
          let text = xhr.responseText;
          // console.log(text);
          let data = JSON.parse(text);
          // 接收数据,通过 json 转换使用
          console.log(data);
          reders(data)
        }
      };
      let str = ""
      // 创建一个空变量
      // 渲染函数需要用到递归函数
      function reders(data) {
        for (let item of data) {
          if (item.child) {
            str += `<p class="one" onclick="but(this)">${item.name}<img src="./img/下拉.png" style="height: 20px;"></p>
            <div style="display: none;" class="bill">`
            reders(item.child)
            str += `</div>`
          } else {
            str += `<p class="one">${item.name}</p>`
          }
        }
        document.getElementsByClassName("text")[0].innerHTML = str
      }
      // 点击显示判断和隐藏
      function but(e) {
        let childItem = e.nextSibling.nextSibling
        if (childItem.style.display == "block") {
          childItem.style.display = "none"
        } else {
          childItem.style.display = "block"
        }
      }
    </script>

html和css

<style>
      * {
        margin: 0;
        padding: 0;
      }
      body {
        background-color: #019588;
      }
      .text {
        width: 80%;
        height: 500px;
        margin-left: 10%;
        color: #ffffff;
      }
      em {
        background-color: #ffffff;
        height: 2px;
        display: block;
      }
      .one {
        margin-top: 2%;
      }
      .bill {
        margin-left: 5%;
      }
    </style>
<h3 style="text-align: center;">数据分类</h3>
    <i style="background-color: #ffffff; display: block; height: 1px;"></i>
    <div class="text">
    </div>


相关文章
|
5月前
|
JavaScript 前端开发 Python
分享77个JS菜单导航,总有一款适合您
分享77个JS菜单导航,总有一款适合您
39 0
|
5月前
|
JavaScript iOS开发 Python
分享114个JS菜单导航,总有一款适合您
分享114个JS菜单导航,总有一款适合您
59 0
|
5月前
|
移动开发 JavaScript 前端开发
分享113个JS菜单导航,总有一款适合您
分享113个JS菜单导航,总有一款适合您
77 0
|
5月前
|
存储 JavaScript 前端开发
JavaScript中的递归函数
JavaScript中的递归函数
47 0
|
3月前
|
数据采集 缓存 JavaScript
JavaScript递归函数的设计与优化
JavaScript递归函数的设计与优化
|
3月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
60 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
4月前
|
JavaScript 前端开发 算法
虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。
【6月更文挑战第27天】虚拟DOM是React的关键技术,它是个轻量的JS对象树,模拟实际DOM结构。当状态改变,React不直接修改DOM,而是先构建新的虚拟DOM树。通过 diff 算法比较新旧树,找到最小变更,仅更新必要部分,提高性能,避免频繁DOM操作。虚拟DOM还支持跨平台应用,如React Native。它优化了更新流程,简化开发,并提升了用户体验。
37 1
|
5月前
|
移动开发 JavaScript 前端开发
分享111个JS菜单导航,总有一款适合您
分享111个JS菜单导航,总有一款适合您
138 0
|
3月前
|
数据采集 缓存 JavaScript
JavaScript递归函数的设计与优化
JavaScript递归函数的设计与优化
|
3月前
|
JavaScript
js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点
js 解析和操作树 —— 获取树的深度、提取并统计树的所有的节点和叶子节点、添加节点、修改节点、删除节点
99 0