树状菜单分析

树状菜单总结

首先先用ajax获取假数据

然后在获取假数据里面判断的时候添加一个函数,for循环遍历里面所有的数据,然后判断pid等于0的数据,然后添加到新创建的空数组里面

将添加好的数组作为下面创建函数的实参的值,用于渲染页面,然后for循环遍历数组里面所有的数据,判断里面是否有子集,若有就递归渲染子节点并且字符串拼接箭头,若没有则渲染当前节点

添加点击事件,判断点击父节点的时候将子节点显示出来,将箭头旋转180度,并且给箭头添加过渡时间

javascript 复制代码
$(document).ready(function () {
    let xhr = $.ajax({
        url: './js/tree.json', // 请求地址
        method: 'GET', // 请求方式
        dataType: 'json', // 响应数据类型
        success: function (response) {
            data = response; // 将返回的 JSON 数据存储在 data 变量中
            arr = show(data, 0, []); // 调用递归函数,从根节点开始构建树形结构
            console.log(arr); // 打印构建完成的树形数据结构
            rendertree(arr); // 调用渲染树的函数并传入树形数据
        }
    }); 
});

// 定义递归函数,用于构建树形结构
function show(data, pid, arr) {
    for (let i = 0; i < data.length; i++) {
        if (data[i].pid == pid) {
            data[i].children = show(data, data[i].id, []);
            arr.push(data[i]);
        }
    }
    return arr;
}

// 渲染树形结构的函数
function rendertree(data) {
    let str = `<div class="tree_wrap">`;

    for (let i = 0; i < data.length; i++) {
        if (data[i].children.length > 0) {
            str +=
                `<div class="tree_flex">
                    <img src="${data[i].icon}" alt="" class="picture">${data[i].name}
                    <span><img src="./img/ji.png" alt="" class="cons"></span>
                </div>
                <div style="display:none">`;
            str += rendertree(data[i].children);
            str += `</div>`;
        } else {
            str +=
                `<div class="tree_left">
                    <img src="${data[i].icon}" alt="" class="picture">${data[i].name}
                </div>`;
        }
    }
    str += `</div>`;
    $('.tree').html(str); // 将树形结构渲染到页面上的指定位置
    return str;
}

// 定义展开或折叠子节点的函数
$(document).on('click', '.tree_flex', function () {
    let children = $(this).next(); // 获取当前节点的下一个兄弟元素,即子节点容器
    $(this).find('.cons').css('transition', 'transform 1s'); // 设置箭头图标的过渡效果为1秒

    if (children.css('display') == 'block') {
        // 用show并实现添加动画效果
        children.hide(2000);
        $(this).find('.cons').css('transform', 'rotate(0deg)');
    } else {
        children.show(2000);
        $(this).find('.cons').css('transform', 'rotate(180deg)');
        $(this).find('.cons').css('transition', 'transform 1s');
    }
});
相关推荐
Carlos_sam12 分钟前
Opnelayers:封装Popup
前端·javascript
MessiGo37 分钟前
Javascript 编程基础(5)面向对象 | 5.1、构造函数实例化对象
开发语言·javascript·原型模式
前端小白从0开始1 小时前
Vue3项目实现WPS文件预览和内容回填功能
前端·javascript·vue.js·html5·wps·文档回填·文档在线预览
JohnYan1 小时前
Bun技术评估 - 03 HTTP Server
javascript·后端·bun
开开心心就好2 小时前
高效Excel合并拆分软件
开发语言·javascript·c#·ocr·排序算法·excel·最小二乘法
特立独行的猫a2 小时前
Nuxt.js 中的路由配置详解
开发语言·前端·javascript·路由·nuxt·nuxtjs
中微子2 小时前
小白也能懂:JavaScript 原型链和隐藏类的奇妙世界
javascript
咸虾米2 小时前
在uniCloud云对象中定义dbJQL的便捷方法
前端·javascript
梨子同志2 小时前
JavaScript Proxy 和 Reflect
前端·javascript
海的诗篇_2 小时前
移除元素-JavaScript【算法学习day.04】
javascript·学习·算法