uniapp-地区的四级联动

本来填写订单的页面选地址是三级联动的

但是由于领导的要求,需要改成四级联动

解决思路

最开始用的是官方的 picker , 所以我去翻看了uniapp 的官网

我们需要用到的是多列模式

解决步骤

1. 先封装对应的请求

/***   获取省市县街道的列表*/
export const getAddressList = (data) => request({url: '/system/region/list', method: 'get', data: data })

2. 在data内去定义对应的数据

3. 在页面的 created 钩子函数内去调用方法

data () {return {provinceList: [], // 地区列表province: [], //省数组city: [], //市数组district: [], //区数组street: [], //街道数组mulSelect: [], //四级联动显示数组,该数组的值为[[province],[city],[district],[street]]mulSelectId: [] ,// 四级联动的idprovinceId: 110000, //省的idcityId: 110101, //市的iddistrictId: 110101001,//区的idstreetId: '', // 镇/街道idaddress:''};
},
created() {this.getList('', '1')	
},
methods: {// 获取地址列表async getList(id, level) {const data = {parentId: id,level: level}const res = await getAddressList(data)if (this.mulSelect.length !== 4) {if(level == 1) {this.province = res.data.datathis.getProvince();this.mulSelectId.push(res.data.data[0].id)this.mulSelect.push(this.province);			this.getList(this.provinceId, '2')} else if (level == 2) {this.city = res.data.datathis.getCity();this.mulSelectId.push(res.data.data[0].id)this.mulSelect.push(this.city);this.getList(this.cityId, '3')} else if (level == 3) {this.district = res.data.datathis.getDistrict();this.mulSelectId.push(res.data.data[0].id)this.mulSelect.push(this.district);this.getList(this.districtId, '4')}} else {if(level == 1) {// this.provinceId = res.data.data[0].idconsole.log(id)this.mulSelectId[0] = idconsole.log(this.mulSelectId)this.getProvince();			this.getList(this.provinceId, '2')} else if (level == 2) {this.city = res.data.datathis.cityId = res.data.data[0].idthis.mulSelectId[1] = this.cityIdthis.getCity();this.mulSelect[1] = this.city;this.getList(this.cityId, '3')} else if (level == 3) {this.district = res.data.datathis.districtId = res.data.data[0].idthis.mulSelectId[2] = this.districtIdthis.getDistrict();this.mulSelect[2] = this.district;this.getList(this.districtId, '4')} else if (level == 4) {this.street = res.data.datathis.streetId = res.data.data[0].idthis.mulSelectId[3] = this.streetIdthis.getStreet();this.mulSelect[3] = this.street;}}},
}

因为这个接口需要两个参数 而第一层级的省份是不需要id,只需要层级 所以在created内去调用的时候 只用传一个参数

这个方法是分了两种情况

第一种情况是刚进入页面的时候去获取地区的时候 因为我们定义的列表 mulSelect 数据是空的,所以说,这个时候 发请求获取到的数据 就是向这个数组内去push

第二种情况是 当后续切换地区的时候 这个时候就不能用push了 只能对应的地方去替换原来的数据

例如: this.mulSelectId[1] = this.cityId

判断条件的话 我预想的比较好的方法就是通过去判断 mulSelect 数组的长度 因为最开始添加的时候length肯定是为0 的 但是这个时候就需要做一个小改动 因为不能直接写

if (this.mulSelect.length == 0) 一些特殊情况 例如北京市 的情况下 总共是只有三级的 然后切换到xx省之后 就有四层数据 这个时候第四层数据怎么去替换呢 只能说push进去

当然 这个方法是接收两个参数的 第一个是对应的id 第二个是层级

因为我们发请求的时候是需要判断层级的 所以我又加了一层if判断 目的是为了区分一下

4. 初次调用请求方法

在实际开发中,为了用户的体验效果 肯定是第一次把四级的数据都展示出来,但是一次只能发一次请求

这个时候层级就派上用场了 当为第一层的时候发第一个请求, 得到省级别的列表,先调另外的方法把列表添加进入 muSelect 数组内

请求成功的时候也是拿到了第一个省份的id,我们拿到id后 递归 调用自身 但是传层级为2和对应的省id,这个时候就进入到了层级为2的逻辑内了 其实和层级1一样 这一层级也是获取到对应的市列表,调用方法添加到数组内 ,然后再调用自身传递3 ...........依次循环,直到循环完四次循环

下面是图解

因为默认第一个北京 只有三层 所以写三层就够了

5. 切换时请求

切换时 绑定的事件 @columnchange="colChange"

// 地址改变触发colChange(e) {// console.log(e.detail);// console.log(this.mulSelect[0][e.detail.value])switch (e.detail.column){case 0://选择省this.mulSelect[1] =[]this.mulSelect[2] =[]this.mulSelect[3] =[]this.provinceId=this.mulSelect[0][e.detail.value].id;console.log(this.provinceId)this.getList(this.provinceId, e.detail.column+2 )break;case 1://选择市this.mulSelect[2] =[]this.mulSelect[3] =[]this.cityId = this.mulSelect[1][e.detail.value].id;this.getList(this.cityId, e.detail.column+2 )break;case 2://选择区this.mulSelect[3] =[]this.districtId = this.mulSelect[2][e.detail.value].id;this.getList(this.districtId, e.detail.column+2 )break;case 3://选择街道this.streetId = this.mulSelect[3][e.detail.value].idbreak;default:break;}},

触发该事件 事件的e内有一个 detail 里面有两个属性 一个是value 一个是column

value 是对应的层级下的索引

column 是对应的层级

我这里+2 是因为 1. 此处的层级也为索引 是从0开始的,而请求时是从1开始的

2. 得到第一层的id 应该去请求的是第二层的数据 所以还要+1

所以此处的处理逻辑和3差不多,只是多了一个切换 在对应的层级调用对应的接口

请求后的操作也有所区别 ,例如请求得到的数据是直接去赋值替换 不是push添加

再细节一点的地方就是: 发请求前 先把对应需要替换的值先赋值一个空值

6. 完整代码

// 1
<template><view class="input-wrapper"><view class="label">所属区县</view><view class="input-box"><picker class="input" mode="multiSelector"  :range="mulSelect" :range-key="'fullname'" @change="pickerChange" @columnchange="colChange"><view class="region" :class="!address? 'placeholder' : ''">{{address || '请选择区域' }}</view></picker></view><view class="iconfont location" @click="handleLocation">定位</view></view>
</template>// 2
<script>import { getAddressList} from '@/api/add-house/add-house.js'export default {data () {return {provinceList: [], // 地区列表province: [], //省数组city: [], //市数组district: [], //区数组street: [], //街道数组mulSelect: [], //四级联动显示数组,该数组的值为[[province],[city],[district],[street]]mulSelectId: [] ,// 四级联动的idprovinceId: 110000, //省的idcityId: 110101, //市的iddistrictId: 110101001,//区的idstreetId: '', // 镇/街道idaddress:''};},created() {this.getList('', '1')	},methods: {// 获取地址列表async getList(id, level) {const data = {parentId: id,level: level}const res = await getAddressList(data)if (this.mulSelect.length !== 4) {if(level == 1) {this.province = res.data.datathis.mulSelectId.push(res.data.data[0].id)this.mulSelect.push(this.province);			this.getList(this.provinceId, '2')} else if (level == 2) {this.city = res.data.datathis.mulSelectId.push(res.data.data[0].id)this.mulSelect.push(this.city);this.getList(this.cityId, '3')} else if (level == 3) {this.district = res.data.datathis.mulSelectId.push(res.data.data[0].id)this.mulSelect.push(this.district);this.getList(this.districtId, '4')}// } else if (level == 4) {// 	this.street = res.data.data// 	this.mulSelectId.push(res.data.data[0].id)// 	this.mulSelect.push(this.street);// }} else {if(level == 1) {this.mulSelectId[0] = id		this.getList(this.provinceId, '2')} else if (level == 2) {this.city = res.data.datathis.cityId = res.data.data[0].idthis.mulSelectId[0] = idthis.mulSelect[1] = this.city;this.getList(this.cityId, '3')} else if (level == 3) {this.district = res.data.datathis.districtId = res.data.data[0].idthis.mulSelectId[1] = idthis.mulSelect[2] = this.district;this.getList(this.districtId, '4')} else if (level == 4) {this.street = res.data.datathis.streetId = res.data.data[0].idthis.mulSelectId[2] = idthis.mulSelectId[3] = this.streetIdconsole.log(this.mulSelectId)this.mulSelect[3] = this.street;}}},// 选中的地址发生改变时触发pickerChange(e) {console.log(e,'change')//什么都不选的话,e.detail.value的值为[null,null,null,null]//只选择省的话,e.detail.value的值为[数字,null,null,null]//只选择市的话,e.detail.value的值为[数字,数字,null,null]//所以获取e.detail.value的值先判断是否为null,如果为null则取值为0for(var i=0;i<e.detail.value.length;i++){if(e.detail.value[i]===null){e.detail.value[i]=0;}}var s_province=this.mulSelect[0][e.detail.value[0]];//获取选中的省var s_city=this.mulSelect[1][e.detail.value[1]||0];//获取选中的市var s_district=this.mulSelect[2][e.detail.value[2]||0];//获取选中的区if(this.mulSelect[3].length !== 0) {console.log(this.mulSelect)var s_street=this.mulSelect[3][e.detail.value[3]||0];//获取选中的街this.address=s_province.fullname+s_city.fullname+s_district.fullname+s_street.fullname;} else {this.address=s_province.fullname+s_city.fullname+s_district.fullname}//赋值显示在页面},// 地址改变触发colChange(e) {// console.log(e.detail);// console.log(this.mulSelect[0][e.detail.value])switch (e.detail.column){case 0://选择省this.mulSelect[1] =[]this.mulSelect[2] =[]this.mulSelect[3] =[]this.provinceId=this.mulSelect[0][e.detail.value].id;console.log(this.provinceId)this.getList(this.provinceId, e.detail.column+2 )break;case 1://选择市this.mulSelect[2] =[]this.mulSelect[3] =[]this.cityId = this.mulSelect[1][e.detail.value].id;this.getList(this.cityId, e.detail.column+2 )break;case 2://选择区this.mulSelect[3] =[]this.districtId = this.mulSelect[2][e.detail.value].id;this.getList(this.districtId, e.detail.column+2 )break;case 3://选择街道this.streetId = this.mulSelect[3][e.detail.value].idbreak;default:break;}},}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/109641.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电源专题】案例:异常样机为什么只在40%以下电量时与其他样机显示电量差异10%,40%以上电量差异却都在5%以内。

本案例发生在一个量产产品的测试中,因为产品带电池,所以需要测试产品对于电池电量显示的精确程度。产品使用的是最简单的开路电压查表法进行设计。 案例测试报告的问题在于不同样机之间电量百分比存在差异,大部分是在3%~4%之间。但在7.2V电压时,能够差异10%左右。 在文章:…

Jenkins 页面部分显示Http状态403 被禁止

前言 生产环境Jenkins部署了一段时间了&#xff0c;结果今天在流水线配置中&#xff0c;部分页面显示Jenkins 页面部分显示Http状态403 被禁止&#xff0c;修改配置点击保存之后偶尔也会出现这个。 问题 以下是问题图片 解决 在全局安全配置里面&#xff0c;勾选上启用代…

752. 打开转盘锁

链接&#xff1a; 752. 打开转盘锁 题解&#xff1a; class Solution { public:int openLock(vector<string>& deadends, string target) {std::unordered_set<std::string> table(deadends.begin(), deadends.end());if (table.find("0000") ! t…

Qt应用程序连接达梦数据库-飞腾PC麒麟V10

目录 前言1 安装ODBC1.1 下载unixODBC源码1.2 编译安装1.4 测试 2 编译QODBC2.1 修改 qsqldriverbase.pri 文件2.2 修改 odbc.pro 文件2.3 编译并安装QODBC 3 Qt应用程序连接达梦数据库测试4 优化ODBC配置&#xff0c;方便程序部署4.1 修改pro文件&#xff0c;增加DESTDIR 变量…

如何解决Maven依赖冲突?

Maven依赖冲突是一个很常见的问题&#xff0c;它通常发生在项目中有多个依赖包含相同库的不同版本时。我这边解决Maven依赖冲突的几种常用方法如下&#xff1a; 1、显示依赖树 首先&#xff0c;使用以下命令查看项目的依赖树&#xff0c;以确定哪些依赖导致了冲突&#xff1a…

React 全栈体系(七)

第四章 React ajax 一、理解 1. 前置说明 React本身只关注于界面, 并不包含发送ajax请求的代码前端应用需要通过ajax请求与后台进行交互(json数据)react应用中需要集成第三方ajax库(或自己封装) 2. 常用的ajax请求库 jQuery: 比较重, 如果需要另外引入不建议使用axios: 轻…

使用Python CV2融合人脸到新图片--优化版

优化说明 上一版本人脸跟奥特曼图片合并后边界感很严重&#xff0c;于是查找资料发现CV2还有一个泊松函数很适合融合图像。具体代码如下&#xff1a; import numpy as np import cv2usrFilePath "newpic22.jpg" atmFilePath "atm2.jpg" src cv2.imrea…

详解哈希,理解及应用

全文目录 概念哈希冲突及原因解决哈希冲突的方法闭散列线性探测二次探测扩容 开散列扩容 哈希的应用位图布隆过滤器 概念 通过映射关系将关键字映射到存储位置&#xff0c;并实现增删改查操作。 通过上面的方法构造出来的结构就叫哈希表&#xff08;散列表&#xff09;&#x…

(9.8-9.14)【大数据新闻速递】

加gzh“大数据食铁兽”&#xff0c;了解更多大数据快讯 【2023百度十大科技前沿发明】 近日&#xff0c;百度发布了“2023百度十大科技前沿发明”&#xff0c;包括“基于大模型的检索生成决策交互一体的智能系统”“基于大模型的端到端搜索技术”“飞桨端到端自适应的分布式训…

Qt ---进程间的通信

进程间通讯方式Qt 提供了四种进程间通信的方式&#xff1a; 使用共享内存&#xff08;shared memory&#xff09;交互&#xff1a;这是Qt 提供的一种各个平台均有支持的进程间交互的方式。TCP/IP&#xff1a;其基本思想就是将同一机器上面的两个进程一个当做服务器&#xff0c…

ChatGPT Code Interpreter实用教程,14种方法助你数据分析绘图

目录 1. 设置解释一下上传的文档高难度&#xff1a;根据文档创建10个可视化图表代表不同的数据。 1. 设置 勾选 Advanced data analysis 选择GPT-4&#xff0c;下面已经出现了代码解释器 点击 解释一下上传的文档 Prompt&#xff1a;请用简单的语言&#xff0c;解释一下该…

Redis Cluster集群运维与核心原理剖析

Redis集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态&#xff0c;如果master节点异常&#xff0c;则会做主从切换&#xff0c;将某一台slave作为master&#xff0c;哨兵的配置略微复杂&#xff0c;并且性能和高可用性…