今天在项目中需要通过行政区域选择,然后选择该行政区域下面的景区,也就是要构建行政区划、景区两表数据表的树。全国的行政区域到县已经3500多了,再加上景区会有几万个点,这棵选择树不论是在后台还是在前台构建都比较大,会影响系统性能,需要前后端结合,动态构建,使用时用懒加载,提升系统性能。

一、后台构建两个表的数据选择查询功能
1、行政区域需要按省、市、县的adcode和级别查询,以便于动态构建。两个参数,adcode后台查询时会将后面的0去掉匹配,级别如果0或空,查询匹配下所有的,为数字只查本级。这里有两个参数,用@requestParam传递的,注意要用post,前端VUE使用get传递时会报错。

@PostMapping("/listjson" ) @ApiOperation("根据查询条件获取区划清单") public AjaxResult listJson(@RequestParam(name="adcode", required = true) String adcode, @RequestParam(name="level",required = true) String level) { System.out.println(adcode); List> regionJson = iMapRegionService.selectRegionJson(adcode,level); return AjaxResult.success(regionJson); }}
2、查询行政区域下的景区,根据adcode查询,一个参数,参数放在路径中传递的。

@GetMapping("/listByCode/{adcode}") @ApiOperation("根据查询条件获取景区清单") public AjaxResult listByCode(@PathVariable String adcode) { List> scenicList = iMapScenicService.selectScenicByCode(adcode); return AjaxResult.success(scenicList); }}
二、在VUE中引入Treeselect
由于后面要用懒加载,在引用Treeselect给件同时,还要引入LOAD_CHILDREN_OPTIONS,Treeselect要加到components中。

import { LOAD_CHILDREN_OPTIONS, Treeselect } from '@riophae/vue-treeselect' import '@riophae/vue-treeselect/dist/vue-treeselect.css' export default { components: { Treeselect }, data() { return { //地点列表 regionOptions: [],
三、使用Treeselect组件
noChildrenText="更新中..." , //由于缺省会将没有加载下级节点的children设置为null,系统缺省会显示No sub-options,点击节点是,显示更新中更好,更新完成显示子节点。

:load-options="loadOptions" //增加此选项,在后方扩展子节点是会调用此方法,第一是点击左边的三解形,第二下面将非叶子节点设置为不能选择,点击节点也会自动扩展。

:disable-branch-nodes="true"> //将树枝节点设置为不能选择,树枝节点是行政区域,也不我们需要的景区ID,所以不能选择,否则数据会乱。

https://blog.csdn.net/wujize/article/details/106106416

四、构建初始的省级目录
组件打开初始化时,构建一级选择树

created() { this.getList() this.getTreeselect() }, methods: { /** 生成查询行政区划下拉树结构第一级 */ getTreeselect() { let formData = new FormData() //构建需要查询的参数,先选择省节点 formData.append('adcode', '000000') formData.append('level', '1') listJson(formData).then(response => { //listJson对应是询后台行政区域的接口函数 let data = response.data data.forEach(element => { element['id'] = element.code // 后台传递过来的是code和name,需要换为treeselect所需要的id和label element['label'] = element.name element['level'] = '1' //设置为1级,后续判断需要 element['children'] = null //要设置为空,才能触发:load-options="loadOptions"动用 }) this.regionOptions = data }) },

五、构建动态生成的二、三、四级目录
//动态添加树的子节点 loadOptions({ action, parentNode, callback }) { if (action === LOAD_CHILDREN_OPTIONS) { let formData = new FormData() formData.append('adcode', parentNode.id) switch (parentNode.level) { //判断选择级别 case '1' : /** 生成查询行政区划下拉树结构第二级 */ formData.append('level', '2') listJson(formData).then(res => { //选择市,构建2级 if (res.code === 200) { //后台返回是用code表示返回状态代码,与后台匹配 let data = res.data data.forEach(element => { element['id'] = element.code element['label'] = element.name element['level'] = '2' element['children'] = null }) parentNode.children = data //增加子节点 } }) callback() break case '2' : /** 生成查询行政区划下拉树结构第三级 */ formData.append('level', '3') listJson(formData).then(res => { if (res.code === 200) { let data = res.data data.forEach(element => { element['id'] = element.code element['label'] = element.name element['level'] = '3' element['children'] = null }) parentNode.children = data } }) callback() break case '3' : /** 生成查询行政区下的景区清单 */ listByCode(parentNode.id).then(res => { //第四级是景区,使用的是景区表,根据adcode查询 if (res.code === 200) { let data = res.data console.log(data) data.forEach(element => { //为景区增加一个图标,以示区别 element['label'] = element['label'] + '' //使用emoji文件,标识这是景区,treeselect没有icon图标 element['level'] = '4' }) parentNode.children = data } }) callback() break } } }

最后效果

这通过几天研究,掌握了Treeselect动态构建,可以解决巨树构建问题。

element vue 动态单选_VUE 动态构建混合数据Treeselect选择树,同时解决巨树问题的更多相关文章

  1. vue+element UI 使用select元素动态的从后台获取到

    VUE select元素动态的从后台获取到 <el-form-item label="选择店铺"> <el-select v-model="value& ...

  2. vue 实现tab切换动态加载不同的组件

    vue 实现tab切换动态加载不同的组件 使用vue中的is特性来加载不同的组件.具体看如下代码:这个功能对于vue比较复杂的页面可以使用上,可以把一个页面的功能拆分出来,使代码更简单.使用方式具体看 ...

  3. linux动态库与静态库混合连接

      1, 在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库.使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有 ...

  4. vue+element-ui实现无限级动态菜单树

    使用vue+element-ui实现无限级动态菜单 该案例实现主要使用递归的思想,递归对新人来容易迷惑的是自己调用自己,直到满足条件为止,接下来我们就一步一步实现一个动态多级菜单vue组件 搭建项目并 ...

  5. vue点击时动态改变样式 ------- 最简单的方法

    vue点击时动态改变样式 template中 <li :class="{ active:index==isActive }" @click="changeValue ...

  6. 三、深入Vue组件——Vue插槽slot、动态组件

    一.插槽slot() 1.1简单插槽slot [功能]用于从父组件中,通过子组件写成双标签,向子组件中放入自定的内容 parent.vue [1]首先把child写成双标签样式,把要插入的内容放双标签 ...

  7. vue第十单元(动态组件 keep-alive(钩子函数) 递归组件(name) 组件命名约定)

    第十单元(动态组件 keep-alive(钩子函数) 递归组件(name) 组件命名约定) #课程目标 熟练掌握动态组件的实现 掌握keep-alive缓存组件,以及相应的钩子函数 熟练掌握递归组件, ...

  8. 循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

    在前面随笔<循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理>中介绍了在Vue + Element整合框架中,实现了动态菜单和动态路由的处理,从而可以根据 ...

  9. element-ui table 页面加载时,动态渲染后台传过来的数据(springmvc)

    jsp页面 <%@ page contentType="text/html;charset=UTF-8" language="java" %> &l ...

  10. java 动态代理 和动态编程

    概述 代理分两种技术,一种是jdk代理(机制就是反射,只对接口操作),一种就是字节码操作技术.前者不能算技术,后者算是新的技术.未来将有大的动作或者较为广泛的应用和变革,它可以实现代码自我的编码(人工 ...

随机推荐

  1. 中电金信:技术实践|Flink多线程实现异构集群的动态负载均衡

    导语:Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算.本文主要从实际案例入手并结合作者的实践经验,向各位读者分享当应用场景中异构集群无法做到负载均衡时,如何通 ...

  2. AOP中动态代理详解

    动态代理概述 什么是代理 代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问 什么是动态代理? 动态代理就是,在程序运行期,创建目标对象的代理对象,并对目 ...

  3. 跨语言国密SM4加解密实战:Java与Golang无缝对接

    概述 本文详细介绍了如何在Java和Golang中使用SM4算法进行对称加密和解密操作.通过使用CBC模式和PKCS5填充,成功实现了跨语言的数据加密和解密.无论是Java加密后在Golang解密,还 ...

  4. Python 添加类型标注 | 散发着自由松散气息的代码

    Python 添加类型标注 | 散发着自由松散气息的代码 Python 如此简洁,书写者在声明变量时甚至无需考虑类型. 但是简洁与复杂间,是存在一个平衡点的.当我们书写较为复杂的项目时,还是希望可以拥 ...

  5. 从BIOS+MBR迁移到UEFI+GPT 并修复Ubuntu Grub2 UEFI引导

    之前在虚拟机里使用了默认配置安装了Ubuntu16.04,由于需要扩充磁盘空间不得不将磁盘从MBR分区表转换到GPT分区表. 简单介绍一下思路:首先通过Windows下的DiskGenius软件备份U ...

  6. G1原理—3.G1是如何提升垃圾回收效率

    大纲 1.G1为了提升GC的效率设计了哪些核心机制 2.G1中的记忆集是什么 3.G1中的位图和卡表 4.记忆集和卡表有什么关系 5.RSet记忆集是怎么更新的 6.DCQ机制的底层原理是怎样的 7. ...

  7. 阿里云产品之数据中台架构-copy

    1. 场景描述 客户打包买了很多阿里云的产品,但是阿里云不负责实施,基于阿里云产品与客户需求,拟采用的数据中台架构,有类似需求的,可以参考下,拿走不谢! 2. 解决方案 阿里产品大数据架构图: 从下到 ...

  8. 第五章 非对称加密算法--DH--RSA

    13.1.DH 非对称算法的基石 仅能用于密钥分配,不能用于加解密数据,一般加密数据用AES 密钥长度:512~1024中的64的整数倍 双方各有自己的密钥对 13.2.RSA 最经典的非对称加密算法 ...

  9. linux基础知识(基本认知、操作命令、常用技巧)

    文章目录 Linux基本认知 容量大小 自动补全命令或文件(夹) 复用之前的命令 Linux文件系统 Linux中命令和执行程序长什么样子 执行过的历史命令的记录文件的位置 linux的隐藏文件 Li ...

  10. 网站架构核心技disruptor

    一 序:本章业务场景:队列在数据结构中是一种线性表,从一端插入数据,然后从另一端删除数据.作者举例的场景有:进行异步处理.系统解耦.数据同步.流量削峰.缓冲.限流等. 前面的比较浅,总结起来,核心知识 ...