jeecgboot-vue3笔记(九)——treeSelect树形选择组件的使用(异步加载)
使用效果

初始化加载顶层节点,点击各层的>加载该节点的子节点,加载后>标识去除不再重复加载。
前端代码
vue ant-design组件
- tree-data,树节点,children方式或id、pid方式
 - load-data,展开节点事件,响应该事件加载子节点
 
<a-tree-select v-model:value="sample" :tree-data="sampleTreeData" :load-data="onLoadSampleTreeData"
        style="width: 100%" allowClear treeDataSimpleMode
        :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
        placeholder="请选择测试计划/样品" >
</a-tree-select>
定义interface
- 异步加载通过id和pid匹配,因此没有children属性,替换为id何pid
 - 添加level便于后端识别,如果后端为一个表内的数据且通过id和pid或parentid关联则不需要
 
export interface TreeDataItem {
  id: string | number;
  pId: string | number;
  value: string;
  title: string;
  isLeaf?: boolean;
  level: string;
}
加载(跟节点)数据
调用后端查询数据并赋值给treeData,treeData绑定控件的treeData属性。
async function loadSampleTreeRootData() {
  // loading.value = true
  let params = {"level":"0"};
  sampleTreeNode(params).then(result => {
      console.log(result)
      sampleTreeData.value = sampleTreeData.value.concat(result);
      }).finally(() => {
      });
  // loading.value = false
}
loadSampleTreeRootData()
加载(节点的子节点)数据
响应控件的load-data事件,查询要展开节点的子节点数据,并合并到treeData中,控件会根据id和pid显示层级关系。
const onLoadSampleTreeData = (treeNode: any) => {
      return new Promise((resolve: (value?: unknown) => void) => {
        // console.log("node:");
        // console.log(treeNode.dataRef)
        const { id,level,value } = treeNode.dataRef;
        // console.log("id:"+id);
        // console.log("level:"+level);
        // console.log("value:"+value);
        setTimeout(() => {
            let nextLevel = "1";
            if(level=="1")nextLevel="2";
            let params = {"level":nextLevel, "id":id};
            sampleTreeNode(params).then(result => {
            //    console.log("result:");
            //    console.log(result);
                sampleTreeData.value = sampleTreeData.value.concat(result);
            }).finally(() => {
            });
          resolve();
        }, 300);
      });
    };
后端代码
定义treeNodeVO
pId和isLeaf注解下,避免springMVC默认的序列化。
(默认序列化为pid\leaf)
@Data
public class PlantSampleTreeNodeVO {
    //key
    private String id;
//    private long id;
    @JsonProperty("pId")
    private String pId;
//    private long pId;
    //树节点显示的内容
    private String title;
    //默认根据此属性值进行筛选(其值在整个树范围内唯一)
    private Object value;
    //是否是叶子节点
    @JsonProperty("isLeaf")
    private boolean isLeaf;
    //节点层级
    private String level;
}
controller提供数据
因为是异步加载,三个表的查询可在一个service中实现,或直接使用各自的treeNode的service。
@Override
	public List<PlantSampleTreeNodeVO> getPlantSampleTreeNodeVO(String level, String id) {
		List<PlantSampleTreeNodeVO> plantSampleTreeVONodeList = new ArrayList<>();
		switch (level) {//顶级节点
			case "0":
				//查询所在班组,plant member
				List<Plant> plantList = plantService.list();
				for (Plant plant : plantList) {
					//创建顶层树/节点
					PlantSampleTreeNodeVO plantNode = new PlantSampleTreeNodeVO();
//					System.out.println(plant.getId());
//					System.out.println(Long.parseLong(plant.getId()));
//					System.out.println(Long.valueOf(plant.getId()).longValue());
//					plantNode.setId(Long.parseLong(plant.getId()));
					plantNode.setId(plant.getId());
					plantNode.setPId("0");//and-design tree指定的值
					plantNode.setValue(plant.getId());
					plantNode.setTitle(plant.getPlantName());
					plantNode.setLeaf(false);//需根据业务逻辑判断是否有子节点,省略处理
					plantNode.setLevel("0");
					plantSampleTreeVONodeList.add(plantNode);
				}
				break;
			case "1":
				//查询班组相关的样品组模板
				QueryWrapper<SampleGroupTemplate> sampleGroupTemplateQueryWrapper = new QueryWrapper<>();
				sampleGroupTemplateQueryWrapper.eq("plantid",id);
				List<SampleGroupTemplate> sampleGroupTemplateList = sampleGroupTemplateService.list(sampleGroupTemplateQueryWrapper);
				//循环各样品组模板显示其下的测试计划/样品
				for(SampleGroupTemplate sampleGroupTemplate: sampleGroupTemplateList){
					//添加到树上
					PlantSampleTreeNodeVO sampleGroupNode = new PlantSampleTreeNodeVO();
//					sampleGroupNode.setId(Long.parseLong(sampleGroupTemplate.getId()));
					sampleGroupNode.setId(sampleGroupTemplate.getId());
//					sampleGroupNode.setPId(Long.parseLong(id));
					sampleGroupNode.setPId(id);
					sampleGroupNode.setValue(sampleGroupTemplate.getId());
					sampleGroupNode.setTitle(sampleGroupTemplate.getSampleGroupName());
					sampleGroupNode.setLeaf(false);
					sampleGroupNode.setLevel("1");
					plantSampleTreeVONodeList.add(sampleGroupNode);
				}
				break;
			case "2":
				//查询样品组模板显示其下的测试计划/样品
				QueryWrapper<SgtSample> sampleQueryWrapper = new QueryWrapper<>();
				sampleQueryWrapper.eq("templateid",id);
				List<SgtSample> sampleList = this.list(sampleQueryWrapper);
				//循环各样品
				for(SgtSample sample: sampleList) {
					PlantSampleTreeNodeVO sampleNode = new PlantSampleTreeNodeVO();
//					sampleNode.setId(Long.parseLong(sample.getId()));
					sampleNode.setId(sample.getId());
//					sampleNode.setPId(Long.parseLong(id));
					sampleNode.setPId(id);
					sampleNode.setValue(sample.getId());
					sampleNode.setTitle(sample.getSampleName());
					sampleNode.setLeaf(true);//叶子节点
					sampleNode.setLevel("2");
					plantSampleTreeVONodeList.add(sampleNode);
				}
				break;
		}
		return plantSampleTreeVONodeList;
	}
												
											jeecgboot-vue3笔记(九)——treeSelect树形选择组件的使用(异步加载)的更多相关文章
- jeecgboot-vue3笔记(八)——treeSelect树形选择组件的使用(一次性加载)
		
使用效果 前端代码 定义interface export interface TreeDataItem { value: string; key: string; title?: string; sl ...
 - 后台返回平铺数据,如何转换成树形json并渲染树形结构,ant tree 异步加载
		
如何后台返回对象数组(平铺式) 1.根据字段标识(板块)获取根节点 ### initTreeData(dataOrg){ var resultArr=dataOrg[0] var secArr=[]; ...
 - 插件使用一树形插件---zTree一zTree异步加载
		
zTree 可以实现异步加载.异步加载可以让初次加载速度快,带来好的用户体验. 异步加载 官方源码中的demo提示了例子.例子是采用php语言. 在java语言中,zTree如何与Servlet结合呢 ...
 - 【Unity笔记】使用协程(Coroutine)异步加载场景
		
using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; using System; public ...
 - vue3 + vite实现异步组件和路由懒加载
		
在 Vue2 中,异步组件和路由懒加载处理使用 import 就可以很轻松实现.但是在Vue 3.x 中异步组件的使用与 Vue 2.x 完全不同了.本文就详细讲讲vue3中异步组件和路由懒加载的实现 ...
 - Vue中router路由异步加载组件-优化性能
		
何时使用异步加载组件 当首页app.js文件太大时,可以拆分组件异步加载,如果app.js文件很小时,不建议使用异步加载组件,因为异步加载组件时每次都要发送一个HTTP请求,这样的代价远比首页一次性加 ...
 - 前端提升生产力系列三(vant3 vue3 移动端H5下拉刷新,上拉加载组件的封装)
		
| 在日常的移动端开发中,经常会遇到列表的展示,以及数据量变多的情况下还会有上拉和下拉的操作.进入新公司后发现移动端好多列表,但是在看代码的时候发现,每个列表都是单独的代码,没有任何的封装,都是通过v ...
 - [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
		
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
 - Vue.js 子组件的异步加载及其生命周期控制
		
前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...
 
随机推荐
- hive从入门到放弃(四)——分区与分桶
			
今天讲讲分区表和分桶表,前面的文章还没看的可以点击链接: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--DDL数据定义 hive从入门到放弃(三)--DML数据操作 分区 ...
 - Hibernate快速上手
			
一. Hibernate介绍 1. Hibernate简介 Hibernate是一个开放源码的对象-关系映射(ORM)框架,他对JDBC进行了轻量级封装,开发人员可以使用面向对象的编程思想来进行持久层 ...
 - 获取bootstrap模态框点击的对应项(e.relatedTarget.dataset)
			
//获取绑定的自定义属性值<ul> <li data-toggle="modal" data-index="电表1111" data-targ ...
 - vue引入swiper
			
https://github.com/surmon-china/vue-awesome-swiper/blob/master/examples/03-pagination.vue https://su ...
 - ZXing Blazor 扫码组件 , ssr/wasm通用
			
项目介绍 本项目是利用 ZXing 进行封装的 Blazor 组件库 直接调用手机或者桌面电脑摄像头进行扫码 项目截图 项目地址 https://github.com/den ...
 - title与h1的区别、b与strong的区别、i与em的区别
			
strong标签有语义,是起到加重语气的效果,而b标签是没有的,b标签只是一个简单加粗标签.b标签之间的字符都设为粗体,strong标签加强字符的语气都是通过粗体来实现的,而搜索引擎更侧重strong ...
 - LC-24
			
[24. 两两交换链表中的节点](https://leetcode-cn.com/problems/swap-nodes-in-pairs/) 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的 ...
 - Java的源码执行(建议结合Javase语法学习来加深印象)
			
一.源码执行时的先后顺序: 父类的静态属性和静态块(按照声明顺序) 本类的静态属性和静态块(按照声明顺序) main方法 父类的成员属性和成员块(按照声明顺序) 父类构造器 本类成员属性和块(按照声明 ...
 - 最新MATLAB R2021b超详细安装教程(附完整安装文件)
			
摘要:本文详细介绍Matlab R2021b的安装步骤,为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用.从文件下载到证书安装本文都给出了每个步骤的截图,按照图示进行即可轻松完成安装使用. ...
 - Go 语言字符串常见操作
			
@ 目录 1. 字节数组 2. 头尾处理 3. 位置索引 4. 替换 5. 统计次数 6. 重复 7. 大小写 8. 去除字符 9. 字符串切片处理 10. 数值处理 1. 字节数组 字节与字符的区别 ...