for(int i =0 ;i<tbCategories.size()&& !tbCategories.isEmpty();i++){
// 数据库中,若一个元素有子节点,那么,该元素的id为子节点的父id
//treeMap.get(tbCategories.get(i).getParentId()); // 从map集合中找到父节点
TbCategory category = (TbCategory)treeMap.get(tbCategories.get(i).getParentId());
if(category!=null ){ // 不等于null,也就意味着有父节点
// 有了父节点,要判断父节点下存贮字节点的集合是否存在,然后将子节点放入
if(category.getChildList() == null){
// 判断一个集合是否被创建用null:表示结合还没有被分配内存空间(即还没有被创建),内存大小自然为null
// 用集合的size判断集合中是否有元素,为0,没有元素(集合已经被创建),
category.setChildList(new ArrayList<TbCategory>());
}
category.getChildList().add(tbCategories.get(i)); // 添加到父节点的ChildList集合下
// 这一步其实可以不要,因为我们修改了数据(添加了子节点,然后在将元素放入到map中,
// 若键相同,map会自动覆盖掉相同的键值对,达到更新map集合中的数据的目的),但是我们
// 这里只是从map中取值,而并不关心值的子节点(子节点是对象本身自己封装的。这里我们知道
// 元素从查询后放入map,父节点放入list,然后通过键来在map中取得对象,之后再将修改过的对象重新放入map当中
// ,我们并没有直接操作list,但是在list中对象的值却是已经修改过了,这就是对象的引用传递,同一个引用对象是通过
// 地址值来操作对象的,即有不同的引用,但是对象中的属性是已经通过引用的操作而改变的,所以这里一旦修改过后,无论是map中还是list中,再次取值时都已经是更改过后的值了)
treeMap.put(tbCategories.get(i).getParentId(),category); // 把放好的数据放回到map中
}
}
return resultList;
}
实体类:
private Long nodeId;
private String categoryName;
private Long parentId;
private Long childId;
private List<T> childList;以上数据都在后台封装好了,前台直接获取数据显示即可
<el-tree :data="treeList"
:props="defaultProps"
@node-click="handleNodeClick"
node-key="nodeId"
show-checkbox=true>
</el-tree>js:
defaultProps:{
children: 'childList',
label: 'categoryName' // 这里的名字要和你封装的数据中的节点的名字一样
}
// 点击事件










