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

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

 确定原始数据结构 

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

let data = [
{
"id": "1",
"name": "1",
"fatherId": "0",
},
{
"id": "2",
"name": "1-1",
"fatherId": "1"
},
{
"id": "3",
"name": "1-2",
"fatherId": "1"
},
{
"id": "4",
"name": "1-1-1",
"fatherId": "2"
},
{
"id": "5",
"name": "1-1-2",
"fatherId": "2"
},
{
"id": "6",
"name": "2",
"fatherId": "0"
},
{
"id": "7",
"name": "1-2-1",
"fatherId": "3"
}
];

使用map处理数据 

const map = {};
const val = [];
data.forEach((item) => {
map[item.id] = item;
});
data.forEach((item) => {
const parent = map[item.fatherId];
if (parent) {
(parent.children || (parent.children = [])).push(item);
} else {
val.push(item);
}
});

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

 html结构 

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

 动态创建dom 

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

const tree = document.getElementById("tree");

function createLi(data) {
const fid = `d${data.fatherId}`;
const div = document.getElementById(fid); const treeItem = document.createElement("div");
treeItem.id = `d${data.id}`;
treeItem.className = "treeItem";
treeItem.innerHTML = data.name;
div.appendChild(treeItem); if (data.children) {
data.children.forEach(d => {
createLi(d);
});
}
} val.forEach(v => {
createLi(v);
})

css样式 

.treeItem > .treeItem{
padding-left: 10px;
cursor: pointer;
}
.itemIcon {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
background: red;
margin-right: 10px;
}

关注我吧

原生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. filebeat v6.3 多行合并的步骤 多个表达式同时匹配

    配置文件位于/etc/filebeat/filebeat.yml,就是filebeat的主配置文件打开文件filebeat.yml,搜索multiline:,默认是注释的,常用的有如下三个配置: mu ...

  2. 关于Api的那些事儿!

    工作中一直在写Api数据接口,但大部分的Api都存在这样的问题 1.接口请求的地址和参数暴露 2.重要接口返回数据明文暴露 3.APP登录态请求的数据完全性问题 4.代码层的数据完全性问题(从代码层有 ...

  3. Chosen by god【组合数打表】

    Chosen by god 题目链接(点击) Everyone knows there is a computer game names "hearth stone", recen ...

  4. 一篇文章搞懂filebeat(ELK)

    本文使用的filebeat是7.7.0的版本本文从如下几个方面说明: filebeat是什么,可以用来干嘛 filebeat的原理是怎样的,怎么构成的 filebeat应该怎么玩 一.filebeat ...

  5. Android学习笔记使用AlertDialog实现对话框

    使用AlertDialog可以实现如下对话框 案例 布局问文件就加了几个Button,我直接上Java代码了 实现显示带取消,确定按钮的对话框按钮 Button showDialogOne = fin ...

  6. Android开发学习笔记Intent 一

    Inten的概念 1.Intent是Android四大组件直接沟通的桥梁 2.Intent是一种运行时绑定(runtime binding)机制 Intent对象的属性 Itent的种类 Inten过 ...

  7. android 中IntentService的使用场景

    IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行 ...

  8. mysql性能优化总结(MySql避免重复插入记录的几种方法)

    如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了:(area,age,salary),(area,age).(area)三个索引,这被称为最佳左前缀特性.因此我们在创 ...

  9. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  10. msf stagers开发不完全指北(二)

    采用 Golang 开发stagers 上一篇文章 msf stagers开发不完全指北(一)中我们谈到如何采用 c 进行 msf 的 stagers 开发,这篇文章我们探讨一下如何使用 Golang ...