树状结构列表,这个技术点之前有写过了,是基于vue讲解,但似乎都没有解决痛点,最基础的原生JS该怎么实现呢?

这篇文章会全面详细的介绍树状结构列表的实现,从数据处理成树状结构,到动态生成dom节点渲染页面。

 确定原始数据结构 

原始数据是需要按照下面这种结构来定义的,如果原始数据已经是被后端处理成树状结构,就可以省略这一步骤。

  1. let data = [
  2. {
  3. "id": "1",
  4. "name": "1",
  5. "fatherId": "0",
  6. },
  7. {
  8. "id": "2",
  9. "name": "1-1",
  10. "fatherId": "1"
  11. },
  12. {
  13. "id": "3",
  14. "name": "1-2",
  15. "fatherId": "1"
  16. },
  17. {
  18. "id": "4",
  19. "name": "1-1-1",
  20. "fatherId": "2"
  21. },
  22. {
  23. "id": "5",
  24. "name": "1-1-2",
  25. "fatherId": "2"
  26. },
  27. {
  28. "id": "6",
  29. "name": "2",
  30. "fatherId": "0"
  31. },
  32. {
  33. "id": "7",
  34. "name": "1-2-1",
  35. "fatherId": "3"
  36. }
  37. ];

使用map处理数据 

  1. const map = {};
  2. const val = [];
  3. data.forEach((item) => {
  4. map[item.id] = item;
  5. });
  6. data.forEach((item) => {
  7. const parent = map[item.fatherId];
  8. if (parent) {
  9. (parent.children || (parent.children = [])).push(item);
  10. } else {
  11. val.push(item);
  12. }
  13. });

把数组val打印出来看一下。

 html结构 

  1. <div id="d0" class="treeItem"></div>

 动态创建dom 

将动态创建dom封装成一个方法,里面使用了递归。循环val数组调用这个方法,即可以实现动态创建dom。

  1. const tree = document.getElementById("tree");
  2.  
  3. function createLi(data) {
  4. const fid = `d${data.fatherId}`;
  5. const div = document.getElementById(fid);
  6.  
  7. const treeItem = document.createElement("div");
  8. treeItem.id = `d${data.id}`;
  9. treeItem.className = "treeItem";
  10. treeItem.innerHTML = data.name;
  11. div.appendChild(treeItem);
  12.  
  13. if (data.children) {
  14. data.children.forEach(d => {
  15. createLi(d);
  16. });
  17. }
  18. }
  19.  
  20. val.forEach(v => {
  21. createLi(v);
  22. })

css样式 

  1. .treeItem > .treeItem{
  2. padding-left: 10px;
  3. cursor: pointer;
  4. }
  5. .itemIcon {
  6. display: inline-block;
  7. width: 10px;
  8. height: 10px;
  9. border-radius: 50%;
  10. background: red;
  11. margin-right: 10px;
  12. }

关注我吧

原生JS实现树状结构列表的更多相关文章

  1. JQuery 树状结构 jQuery-treeview.js 插件

    由简入繁实现Jquery树状结构 在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一 ...

  2. js List<Map> 将偏平化的数组转为树状结构并排序

    数据格式: [ { "id":"d3e8a9d6-e4c6-4dd8-a94f-07733d3c1b59", "parentId":&quo ...

  3. js 每日一更(数组转换成前端更容易解析的树状结构)

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...

  4. 由简入繁实现Jquery树状结构

    在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一些插件,也是可以实现这些效果的,比 ...

  5. Android无限级树状结构

    通过对ListView简单的扩展.再封装,即可实现无限层级的树控件TreeView. package cn.asiontang.nleveltreelistview; import android.a ...

  6. 使用Map辅助拼装树状结构,消除递归调用

    目前菜单或其他树状结构在数据库中的存储,多数是以一个parentid作为关联字段,以一维形式存储.使用时全部查询出来,然后在内存中拼装成树状结构.现在主要涉及的是拼装方法的问题. 一般可以进行 递归调 ...

  7. 利用checkbox自带属性indeterminate构建含部分选中状态的树状结构

    本来上个月就像发的,但是一直忙啊忙的也没时间整理,所以拖到了现在. 好吧上面这句就是废话,我就是感概下.下面是正文. 前段时间在弄一个轻量级的web项目,要构建一个树状结构目录,同时希望能把部分选中的 ...

  8. 将lits集合转化为树状结构

    一,bean的类型: public class DeptListRES { /** * 子节点 */ private List<DeptListRES> children; private ...

  9. 用Django ORM实现树状结构

    前言 之前看对于用关系数据库实现树状结构的方法就知道一直做自关联的表,但是感觉自关联查询太慢了,最近看到一篇文章,感觉视野开拓了好多,文章:数据库表设计,没有最好只有最适合来自:微信. 下面就针对这里 ...

随机推荐

  1. 面试官:说说Redis的Hash底层 我:......(来自阅文的面试题)

    redis源码分析系列文章 [Redis源码系列]在Liunx安装和常见API 为什么要从Redis源码分析 String底层实现——动态字符串SDS Redis的双向链表一文全知道 前言 hello ...

  2. MySQL数据库离线包安装与注册

    本文主要介绍了MySQL数据库的离线安装和将MySQL服务注册为Windows应用服务的主要步骤. 1.下在安装程序包 MySQL Community Server 5.6.15 官方下载地址http ...

  3. 使用JFreeChart生成条形图

    1. 准备工作 下载JFreeChart,我使用的版本为1.0.19,相关内容参见JFreeChart,下载链接为https://sourceforge.net/projects/jfreechart ...

  4. ios判断当前设备是否是ipad

    + (BOOL)getIsIpad { NSString *deviceType = [UIDevice currentDevice].model; if([deviceType isEqualToS ...

  5. Spring Boot 在启动时进行配置文件加解密

    Spring Boot Application 事件和监听器 寻找到application.yml的读取的操作. 从spring.factories 中查看到 # Application Listen ...

  6. STM32单片机应用与全案例实践 /stm32自学笔记 第二版 pdf

    STM32单片机应用与全案例实践pdf https://pan.baidu.com/s/16WrivuLcHvLTwS__Zcwl6Q 4rj3 stm32自学笔记 第二版 pdf https://p ...

  7. 【漏洞二】Apache HTTP Server "httpOnly" Cookie信息泄露漏洞

    [漏洞] Apache HTTP Server "httpOnly" Cookie信息泄露漏洞 [原因] 服务器问题 Apache HTTP Server在对状态代码400的默认错 ...

  8. Docker部署Python项目

    简介 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如果从一种操作系统里面运行另一种操作系统,通常我们采取的策略就是引入虚拟机,比如在 Wind ...

  9. Spring7——开发基于注解形式的spring

    开发基于注解形式的spring SpringIOC容器的2种形式: (1)xml配置文件:applicationContext.xml; 存bean:<bean> 取bean: Appli ...

  10. ⚡ vue3 全家桶体验

    前置 从创建一个简单浏览器导航首页项目展开,该篇随笔包含以下内容的简单上手: vite vue3 vuex4 vue-router next 预览效果有助于理清这些内容,限于篇幅,不容易展开叙述.由于 ...