树状菜单分析

树状菜单总结

首先先用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');
    }
});
相关推荐
阿洵Rain2 小时前
【Linux】环境变量
android·linux·javascript
6230_5 小时前
关于HTTP通讯流程知识点补充—常见状态码及常见请求方式
前端·javascript·网络·网络协议·学习·http·html
pan_junbiao6 小时前
Vue组件:使用$emit()方法监听子组件事件
前端·javascript·vue.js
hummhumm6 小时前
数据库系统 第46节 数据库版本控制
java·javascript·数据库·python·sql·json·database
Loong_DQX7 小时前
【前端】vue+html+js 实现table表格展示,以及分页按钮添加
前端·javascript·vue.js
伏城之外7 小时前
LeetCode - 15 三数之和
java·javascript·c++·python·leetcode·c
Rverdoser8 小时前
Vue3 中的响应式系统:深入理解 Proxy API
前端·javascript·vue.js
早起的年轻人8 小时前
js window.addEventListener 是什么?
开发语言·前端·javascript
一周七喜h8 小时前
css实现卡片右上角的状态
前端·javascript·css
前端无冕之王9 小时前
如何在 Marketo 中添加新的域名
开发语言·前端·javascript