今天在项目中需要通过行政区域选择,然后选择该行政区域下面的景区,也就是要构建行政区划、景区两表数据表的树。全国的行政区域到县已经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. datagridview点击列头对当前列进行排序的功能无效

    DataGridView 的默认行为是支持通过单击列头对列进行排序,但在以下情况下可能会取消该功能或无法使用: 1. 绑定的数据源不支持排序 如果 DataGridView 的数据源是绑定到一个不支持 ...

  2. arcpy获取polygon内环

    当使用arcpy获取polygon几何的时候,不能像ao一样获取到内外环,只能获取到单个部件.而part返回的即是一个点组了. 所以只能通过None对象进行分割,确定部件内的内外环.一个part内,只 ...

  3. windows版 nvm 1.1.7 安装(填坑)

    参考https://www.jianshu.com/p/cbf4f76ba0bb安装,注意事项: 1. 最好下载Setup安装版本,带安装界面,这样可以填写安装路径以及Nodejs路径,省去了改文件的 ...

  4. Gitlab:Restoring PostgreSQL database gitlabhq_production ... ERROR: must be owner of extension pg_trgm

    Restoring PostgreSQL database gitlabhq_production ... ERROR: must be owner of extension pg_trgm ERRO ...

  5. 东方通TongWeb7.0.4.9M4部署SuperMap iServer 11.2.1

    一.软件版本 操作系统: CentOS Linux release 7.5.1804 (Core) JDK:11.0.18 东方通:TongWeb7.0.4.9M4 SuperMap iServer: ...

  6. 腾讯云 TStor 私有云存储获统信+海光/兆芯官方认证

    腾讯云 TStor 是一款分布式存储产品,致力于解决私有云.混合云下的各类存储需求.产品紧跟国内信创生态,持续加强自主可控能力.目前,TStor 已经支持国内主流国产操作系统和硬件,如中标麒麟操作系统 ...

  7. Debian关闭防火墙命令详解

    防火墙是保护计算机系统安全的关键组件.在一些情况下,需要关闭防火墙,以允许特定的应用程序或服务访问网络.在Debian系统中关闭防火墙的方法多种多样,本文将从多个方面对Debian关闭防火墙命令进行详 ...

  8. Mapstruct使用时报Unknown property xxx in result type xxx. Did you mean null

    0.背景 使用mapstruct时出现: Unknown property "xxx" in result type xxx. Did you mean "null&qu ...

  9. conda虚拟环境中设置环境变量

    引言 使用conda创建虚拟环境就是为了方便管理,各个环境之间的模块是独立的.有时候我们在做项目的时候需要设置一下环境变量才方便实用,但是不想影响到其他的虚拟环境,因此不能再系统的环境变量里面设置. ...

  10. Qt编写地图综合应用24-miniblink内核

    一.前言 用Qt做项目过程中,遇到需要用到浏览器控件的项目,可能都会绕不开一个问题,那就是从Qt5.6版本开始mingw编译器的Qt构建套件,不再提供浏览器控件了,之前还可以用webkit控件,这下很 ...