当前位置: 首页 > news >正文

微信小程序,动态设置三级联动, 省市区街道

在这里插入图片描述

1.第一步   传parentId=0   查询省份
2.第二步   选择省份,传pathId=选择省份的pathId, 不传parentId,会查询出   市/县数据
3.第三步   根据选择县的parentId 查询街道数据,传parentId=选择的县id
4.选择结果回显   显示所选择的 path 以/分割   取最后一级
  <van-dropdown-menu active-color="#409eff" custom-class="filter-menus"><van-dropdown-item id="areaAll" title="区域选择"><view class="areaBox" style="height:288rpx; overflow:auto;"><van-cell class="van-dropdown-item__option dropdown-time {{item.id === parentId ? 'time-active' : ''}}" wx:for="{{areaAllList}}" wx:key="index" data-item="{{item}}" bindtap="areaClick"><view class="van-cell"><view class="van-dropdown-item__title">{{item.name}}</view></view></van-cell></view><view><van-picker show-toolbar columns='{{columns}}' value-key='name' bind:change='chgArea' bind:confirm='confirmArea' bind:cancel='areaClose' /></view></van-dropdown-item></van-dropdown-menu>
Page({data: {//行政区域areaAllList: [],columns: [// {//   values: '', // one,                    //可以是数组,或者对象数组//   className: 'column1' //选择器的第一列// },// {//   values: '', // two[one[0].name],       //默认选中two对象中的第一项//   className: 'column2', //选择器的第二列// },// {//   values: '', // three[two[one[0].name][0].name],  //默认选中three对象中的第一项//   className: 'column3', //选择器的第三列// }],one: [],two: []}})onLoad(options) {//行政区划   areaAllListthis.getParent() //
},
method:{areaClick(e) {//点击省, 请求市级的数据const item = e.currentTarget.dataset.itemthis.setData({parentId: item.id})this.initPath(item.pathId)},getParent() {//获取顶部的省级fetch.apply.getAreaAll({parentId: 0}, res => {if (res.flag == 0) {this.setData({areaAllList: res.object})}})},initPath(pathId) {// 1写入 选择器第一级 数据 ;  2将二级数据, 做成 columns 的格式,并写入fetch.apply.getAreaAll({pathId: pathId}, res => {if (res.flag == 0 && res.object.length > 0) {var v1 = []res.object.forEach((e, i) => {v1[e.name] = e.childs});this.setData({one: res.object,two: v1,})this.setData({columns: [{values: this.data.one, //可以是数组,或者对象数组className: 'column1', //选择器的第一列},{values: this.data.two[this.data.one[0].name], //默认选中two对象中的第一项className: 'column2', //选择器的第二列defaultIndex: 0},{values: '', // this.data.three[this.data.two[this.data.one[0].name][0].name], //默认选中three对象中的第一项className: 'column3', //选择器的第三列}],})} else {this.setData({one: '',two: '',columns: []})}})},confirmArea(event) {// 确定 选择的地区数据let value = event.detail.valueif (!value[0]) {toast("请选择城市")return}if (!value[2]) {//将选中的文字和对应的id拿出来使用// wx.showModal({//   title: '',//   content: '您选中了“' + value[0].name + ',' + value[1].name + ',' +//     '”, di为“' + value[0].id + ',' + value[1].id +//     ',' + '”',//   showCancel: false// })this.setData({areaPathId: value[1].id})} else {//将选中的文字和对应的id拿出来使用// wx.showModal({//   title: '',//   content: '您选中了“' + value[0].name + ',' + value[1].name + ',' +//     value[2].name + '”, di为“' + value[0].id + ',' + value[1].id +//     ',' + value[2].id + '”',//   showCancel: false// })this.setData({areaPathId: value[2].id})}this.getList()this.areaClose()},chgArea(event) {// 滚动选择器, 通过第二级,获取最后一级, 街道数据let picker = event.detail.pickerlet value = event.detail.valuelet index = event.detail.index//在change 第一列的时候,动态更改第二列的数据//setColumnValues是vant自带的实例方法//第一个参数是列数,从0开始;第二个参数是第二列应该显示的数据picker.setColumnValues(1, this.data.two[value[0].name])//此处vant-picker有一个bug,当只滑动第一级时,返回的value数据是错误的,需要我们自己根据第二 级计算,去获取第三级数据if (index == 0) {// picker.setColumnValues(2, this.data.three[(this.data.two[value[0].name][0]).name])} else if (index == 1) {var v2 = {}fetch.apply.getAreaAll({parentId: value[index].id}, res => {if (res.flag == 0) {v2[value[index].name] = res.objectthis.setData({three: v2})picker.setColumnValues(2, this.data.three[value[1].name])}})} else {picker.setColumnValues(2, this.data.three[value[1].name])}},areaClose() {this.selectComponent('#areaAll').toggle()},
}

技术要点

1 按照固定格式, 设置columns 的数据
2 picker.setColumnValues() 方法,获取数据

columns 的数据 格式

var one = [{ id: 111, 'name': '杭州' },{ id: 222, 'name': '宁波' },
]
var two = {'杭州': [{ id: 11100, 'name': '国杭州' },{ id: 22201, 'name': '国宁波' },],'宁波': [{ id: 11102, 'name': '中杭州' },{ id: 22203, 'name': '中宁波' },{ id: 33304, 'name': '中温州' },]
}
var three = {'国杭州': [{ id: 1110000, 'name': 'aaa' },{ id: 2220101, 'name': 'bbb' },],'国宁波': [{ id: 1110102, 'name': 'ccc' },{ id: 2220103, 'name': 'ddd' },{ id: 3330104, 'name': 'eee' },],'中杭州': [{ id: 1110205, 'name': 'fff' },{ id: 2220206, 'name': 'ggg' },{ id: 3330207, 'name': 'hhh' },],'中宁波': [{ id: 1110308, 'name': 'www' },{ id: 2220309, 'name': 'ttt' },{ id: 3330310, 'name': 'yyy' },],'中温州': [{ id: 1110411, 'name': 'jjj' },{ id: 2220412, 'name': 'kkk' },{ id: 3330413, 'name': 'ppp' },]
}
http://www.lryc.cn/news/175515.html

相关文章:

  • Learn Prompt- Midjourney 图片生成:Image Prompts
  • 基于微信小程序的健身房私教预约平台设计与实现(源码+lw+部署文档+讲解等)
  • 安卓Compose(二)
  • TCP 和 UDP哪个更好
  • Spring Boot 如何实现单点登录(SSO)
  • C#中的(++)和(--)运算符
  • SVG鼠标漫游
  • 关于Github报SSL_ERROR_SYSCALL的解决方案
  • Redis 集群搭建教程
  • 图形处理软件Photoshop Elements 2020 mac中文版 ps简化版
  • opencv for unity package在unity中打开相机不需要dll
  • [Linux入门]---进程状态
  • 腾讯mini项目-【指标监控服务重构】2023-08-29
  • opencv 常用的滤波器及应用技巧
  • 【PyTorch攻略(1/7)】 张量基本语法
  • 什么是Jmeter ?Jmeter使用的原理步骤是什么?
  • Mac 通过 brew安装的 ffmpeg 切换版本
  • 【Spring Boot】实战:实现数据缓存框架
  • MySQL数据类型之JSON
  • nginx_0.7.65_00截断_nginx解析漏洞
  • 建站百科:HTTP返回状态码是什么?
  • 人像摄影简记
  • 【Java 基础篇】Java 实现模拟斗地主游戏
  • 计算机专业毕业设计项目推荐09-个人医疗系统(Spring+Js+Mysql)
  • 安卓Compose(一)
  • 【Linux学习】03Linux用户和权限
  • LeetCode 面试题 05.04. 下一个数
  • SDXL prompt 笔记
  • 使用Redis管道进行查询接口性能优化
  • 初学vue.js