树状菜单分析

树状菜单总结

首先先用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');
    }
});
相关推荐
今年下半年6 小时前
【VUE】整合腾讯地图、自定义区域边界、村委名称及资产统计(放大显示资产点位)
前端·javascript·vue.js
可乐鸡翅yeah_9 小时前
hls.js 切换多个视频源,新手开发常见踩坑
开发语言·前端·javascript·ios·ffmpeg·音视频·safari
kyriewen9 小时前
我实测了前端日期的 5 个坑:差 8 小时只是开始
前端·javascript·程序员
anew___9 小时前
《从零手写操作系统 (11):文件系统初探——initrd与VFS抽象层》
java·javascript·算法
今年下半年10 小时前
【VUE3】移动端:使用腾讯地图显示区域统计与放大显示资产点位
javascript·前端框架·vue·地图
a努力。10 小时前
LangChain Agent消息链路全解析
java·前端·javascript
今年下半年10 小时前
【前端】ant-design-vue 表格「行、列都动态」的处理方案
前端·javascript·vue.js
默_笙11 小时前
🚕 缺料就出门买:给 RAG 装上"信息够不够"的判断力
前端·javascript
志尊宝12 小时前
Vue3 零基础每日笔记(054):Pinia 三件套详解——state / getters / actions 全搞懂
前端·javascript·vue.js·vue·前端开发
wangyadong31712 小时前
# el-table 复选框无法选中问题记录
前端·javascript·vue.js