原来有一个组织机构的渲染,

我自己写的我自己看也8太明白了:

https://www.cnblogs.com/mindzone/p/14888046.html

现在,有一个位置选择,使用这个级联选择器做的

https://element.eleme.cn/#/zh-CN/component/cascader#cascader-ji-lian-xuan-ze-qi

后台接口部分

首先是组件需要的节点数据结构:

package cn.ymcd.aisw.store.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors; import java.io.Serializable;
import java.util.List; /**
* 树状节点PO
* @author cloud9
* @createTime 2022/5/18 09:55
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TreeNode implements Serializable {
private static final long serialVersionUID = 1L;
private String label;
private Integer value;
private List<TreeNode> children; public TreeNode(String label, Integer value) {
this.label = label;
this.value = value;
}
}

数据库PO

package cn.ymcd.aisw.store.dto;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import java.io.Serializable; /**
* 行政区域PO
* @author cloud9
* @createTime 2022/5/18 09:57
*
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("PT_AREA")
public class AreaDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 区域Id<br/> TYPE:NUMBER(22)
*/
@TableField("AREAID")
private Integer areaid; /**
* 区域编码<br/> TYPE:NUMBER(22)
*/
@TableField("AREACODE")
private Integer areacode; /**
* 区域名称<br/> TYPE:VARCHAR2(200)
*/
@TableField("AREANAME")
private String areaname; /**
* 区域等级<br/> TYPE:VARCHAR2(2)
*/
@TableField("AREALEVEL")
private String arealevel; /**
* 区域父级<br/> TYPE:NUMBER(22)
*/
@TableField("AREAPARENT")
private Integer areaparent; /**
* 区域序号<br/> TYPE:NUMBER(22)
*/
@TableField("AREASEQ")
private Integer areaseq; /**
* 是否可用<br/> TYPE:VARCHAR2(2)
*/
@TableField("ISENABLED")
private String isenabled; }

接口业务实现类,就是如何组装级联选择器需要的数据结构:

省市县,全部最多的情况是四千多个不到,使用这种递归,还是能处理的

package cn.ymcd.aisw.store.service.impl;

import cn.ymcd.aisw.common.ApiConstants;
import cn.ymcd.aisw.store.dao.AreaDAO;
import cn.ymcd.aisw.store.dto.AreaDTO;
import cn.ymcd.aisw.store.dto.TreeNode;
import cn.ymcd.aisw.store.service.IAreaService;
import cn.ymcd.comm.base.BaseService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors; /**
* @projectName: aisw-root
* @author: cloud9
* @date: 2022年05月18日 10:02
* @version: 1.0
*/
@Service("iAreaService")
public class AreaServiceImpl extends BaseService<AreaDAO, AreaDTO> implements IAreaService { @Resource
private AreaDAO areaDAO; @Override
public List<TreeNode> getAreaCodeList() {
// 筛选所有(可用的 -> isenabled = 1)区域列表
final List<AreaDTO> ALL_AVAILABLE_AREAS = areaDAO.selectList(
new QueryWrapper<AreaDTO>()
.lambda()
.eq(AreaDTO::getIsenabled, ApiConstants.STATUS_NORMAL)
); // 筛选第一级区域的 TreeNode列表,此时每一个节点都没有子集
List<TreeNode> headerTreeNodes = ALL_AVAILABLE_AREAS
.stream()
.filter(area -> area.getAreaparent().equals(0))
.map(area -> new TreeNode(area.getAreaname(), area.getAreacode()))
.collect(Collectors.toList()); // 然后对头的每个节点进行递归获取内部节点
headerTreeNodes.forEach(header -> buildTreeNodeWithRecursive(header, ALL_AVAILABLE_AREAS));
return headerTreeNodes;
} /**
* 使用递归进行树状节点集构建
* @param treeNode 需要被装填(若干层级)的节点
* @param ALL_AREA_LIST 树状节点的数据源
* @return void
* @author cloud9
* @createTime 2022/5/18 11:53
*
*/
private void buildTreeNodeWithRecursive(TreeNode treeNode, final List<AreaDTO> ALL_AREA_LIST) {
// 获取入参节点的的子节点列表, 从总集合中过滤
List<TreeNode> recursiveTreeNodeList = ALL_AREA_LIST
.stream()
.filter(area -> area.getAreaparent().equals(treeNode.getValue()))
.map(area -> new TreeNode(area.getAreaname(), area.getAreacode()))
.collect(Collectors.toList()); // 如果这子节点是最后一层了,也就是查不到子节点集合,则终止这个递归
if (CollectionUtils.isEmpty(recursiveTreeNodeList)) return; // 1、否则继续下去, 将子节点存入这个节点下面
treeNode.setChildren(recursiveTreeNodeList); // 2、然后将这个子节点列表遍历, 获取它的后代
recursiveTreeNodeList.forEach(childTreeNode -> this.buildTreeNodeWithRecursive(childTreeNode, ALL_AREA_LIST));
} }

  

前台渲染部分:

<el-form-item label="门店位置" prop="areaName">
<el-cascader
:ref="selectorRefTag"
v-model="store.areaAddrs"
placeholder="试试搜索:南昌"
:props="{ value: 'label' }"
:options="areaTreeNode"
style="width: 220px"
filterable
@change="handleAreaSelectChange"
/>
</el-form-item>

数据来源,接口就是GET请求,不进行任何认证校验:

async created() {
const { data: res } = await getAreaTreeNodeList()
console.log(res)
this.areaTreeNode = res
},

绑定的Change事件方法:

选中的数据会排在第一个,这里因为业务需要,我要的是路径标签

就是把这个PathLabels数组,转成拼接字符,也可以取PathValues取ID值

handleAreaSelectChange() {
// 获取选中的所有节点的路径,并且用join()方法分割转换为字符串
this.labels = this.$refs[this.selectorRefTag]
.getCheckedNodes()[0]
.pathLabels.join('')
console.log(this.labels)
},

  

回显的问题:

设置的v-model值就是绑定选中数据,所以回显的时候,把这个绑定值赋值上去即可

/* 区域回显 */
if (this.store.areaName) this.store.areaAddrs = this.store.areaName.split(',')

  

 

【Vue】树状节点接口 与 级联选择框组件的更多相关文章

  1. ElementUI 级联选择框 设置最后一级可选及相关问题解决

    在使用 elementUI 的 el-cascader 级联选择框进行省市联动效果时,有这么一个需求:该级联选择框一共有三级结构分别为国家-省份-城市,国家和省份为必选项,城市为可选项.具体实现如下: ...

  2. vue自定义可输入的选择框组件

    vue自定义可输入的选择框组件 props: 属性 说明 类型 默认值 selectDataList 下拉框中的内容 Array 空数组([]) value 输入框中的内容 String 空字符串(& ...

  3. Ajax级联选择框

    Ajax级联选择框 级联选择框常用与比较负责的网页开发,例如实现的商品添加页面中,需要选择商品的分类,而分类信息又有层次,例如大分类和小分类就是两层级联,在用户选择商品所属大类时,所属小类的内容需要根 ...

  4. Vue表单绑定(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)

    <!DOCTYPE html><html>    <head>        <meta charset="utf-8">      ...

  5. elementUI 级联选择框 表单验证

    今天遇到了一个需求:进行级联选择框的表单验证,突然有点懵逼.感觉应该和正常的表单验证类似,但不是很清晰,后来还是在博客园找到了相关参考文章. 先上代码: <el-form :model=&quo ...

  6. Excel 名称管理器是什么,并实现一个级联选择框

    名称 在 Excel 中,每一个单元格都有自己的名称.表格横向是字母,纵向是数字,组合起来就是一个单元格的名称. A13 所代表的是 A 列,13 行的单元格.把一组单元格组合起来,加上一个名称,在 ...

  7. vue 树状图数据的循环 递归循环

    在main.js中注册一个子组件 在父组件中引用 树状图的数据格式 绑定一个数据传入子组件,子组件props接收数据 子组件中循环调用组件,就实现了递归循环

  8. Vue.js与ElementUI搭建无限级联层级表格组件

    前言 今天,回老家了.第一件事就是回家把大屏安排上,写作的感觉太爽了,终于可以专心地写文章了.我们今天要做的项目是怎么样搭建一个无限级联层级表格组件,好了,多了不多说,赶快行动起来吧!项目一览 到底是 ...

  9. vue树状结构(tree)

    <!DOCTYPE html> <html> <head> <title></title> <style> body { fon ...

  10. Js异步级联选择框实践方法

    HTML: <li> <span>所在地区:</span> <select name="prov" id="ddl_prov&q ...

随机推荐

  1. Qt-绘图设备

    1  简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=40 Qt绘图设备有三种:QPixmap.QBitmap.QImage.QPictur ...

  2. C# 利用Autofac批量接口注入依赖【学习记录】

    背景: 本人在一位大佬的Colder框架中看到了这个接口注入,然后呢就想学习一下ioc思想与di设计模式.此写法给我的感觉就是 非常的 优雅 ,优雅永不过时.关于接口注入的概念和ioc和di具体是什么 ...

  3. liquibase常用操作

    1.概述 Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. 本文旨在将平时工作中常用的一些操作进 ...

  4. C#.NET Winform使用线程承载WCF (硬编码配置)

    winform同步承载WCF时,遇到大量请求,可能会阻塞UI线程.这时就需要开个线程来承载WCF. 1.硬编码形式创建WCF服务,WCFServer类: using CommonUtils; usin ...

  5. JAVA RSA 私钥签名 公钥验证签名 公钥验签

    JAVA RSA 私钥签名 公钥验证签名 公钥验签 1.待签名字符串转为byte数组时,一般使用UTF8. 2.将私钥字符串(PKCS8格式)转为PKCS8EncodedKeySpec对象. 3.使用 ...

  6. docker综合应用

    1.容器资源限制 官网文档 https://docs.docker.com/config/containers/resource_constraints/ 2.docker内存限制 -m或者--mem ...

  7. WIndow Server 2019 服务器 MinIO下载并IIS配置反向代理

    1.官网下载并配置 下载MinIO Serve地址(不需要安装,放在目录就行) https://dl.min.io/server/minio/release/windows-amd64/minio.e ...

  8. 打开ftp服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹

    产生这种现象有很多方面的原因 如果你能用命令行的方式访问ftp服务器,但是不能用资源管理器访问,那么请看下去. 1.打开IE浏览器,点击设置 2.点击Internet选项,进入高级 3.取消勾选 大功 ...

  9. .NET个人博客-使用Back进行消息推送

    使用Back推送消息到你的iPhone 前言 我的好友看了我的博客,给我提了个需求,让我搞个网站通知,我开始以为就是评论回复然后发送邮件通知.不过他告诉我网站通知是,当有人评论或者留言后,会通知到我这 ...

  10. 基于cifar数据集合成含开集、闭集噪声的数据集

    前言 噪声标签学习下的一个任务是:训练集上存在开集噪声和闭集噪声:然后在测试集上对闭集样本进行分类. 训练集中被加入的开集样本,会被均匀得打上闭集样本的标签充当开集噪声:而闭集噪声的设置与一般的噪声标 ...