支付宝小程序实现省市区三级联动


Posted in Javascript onJune 21, 2020

本文实例为大家分享了支付宝小程序实现省市区三级联动的具体代码,供大家参考,具体内容如下

背景

最近做的项目 有省市区联动。不仅要传name还要把对应的id发给后台。
支付宝提供的级联有 my.multiLevelSelect 和picker并不能满足需求。
picker 组件不支持多列选择,所以使用 picker-view 组件和Popup配合使用。

实现效果图

支付宝小程序实现省市区三级联动

支付宝小程序实现省市区三级联动

数据结构
citys - 城市 areas - 区

当然这是处理之后的,行政区划树 不长这样子。

[{
 code:1,
 name:'北京',
 areas:[
  {
  code: 101,
  name:'朝阳区'
  },
  {
  code: 101,
  name:'丰台区'
  }
 ]
 },{
 code:2,
 name:'河北省',
 citys:[
  {
  code: 20,
  name:'石家庄市',
  areas:[{
   code:'201',
   name:'长安区'
  }]
  }
 ]
 }]

详细实现 仅供参考

//ahtml
<popup show="{{showBottom}}" position="bottom" onClose="onPopupClose" className="cityPop">
 <view class="flex">
 <view onTap="onPopupClose">取消</view>
 <view onTap="bindMultiPickerChange" class="confrim">确定</view>
 </view>
 <view>
  <picker-view value="{{multiIndex}}" onChange="bindMultiPickerColumnChange" class="mypicker">
  <block a:for="{{multiArray}}">
   <picker-view-column key="{{index}}">
   <block a:for="{{item}}" a:for-item="colItem">
    <view key="{{colItem.code}}">{{colItem.name}}</view>
   </block>
   </picker-view-column>
  </block>
 </view>
 </popup>
// 滚动选择 
bindMultiPickerColumnChange(e) {
 // 注意处理直辖市自治区(nodeType =2 -- citys(null) areas(Array))与其他省份(nodeType=1 -- citys(Array) areas(Array))
 let newColums = e.detail.value;
 let {
  multiIndex
 } = this.data;
 let newMultiIndex=[]
 if(multiIndex[0]!=newColums[0]) {
  newMultiIndex=[newColums[0], 0, 0]
  }else {
  newMultiIndex=[multiIndex[0], newColums[1],newColums[2]|| 0]
  };
 console.log('修改的列为', newMultiIndex);
 var data = {
  multiArray: this.data.multiArray,
  multiIndex: newMultiIndex
 };
 var data.multiArray[0] = this.data.provinces;
 if ((temp[data.multiIndex[0]].citys) && (temp[data.multiIndex[0]].citys).length > 0) {
  //如果第二列“市”的个数大于0,通过multiIndex变更multiArray[1]的值
  data.multiArray[1] = temp[data.multiIndex[0]].citys || [];
  var areaArr = (temp[data.multiIndex[0]].citys[data.multiIndex[1]]) && (temp[data.multiIndex[0]].citys[data.multiIndex[1]]).areas || [];
  //如果第三列“区”的个数大于0,通过multiIndex变更multiArray[2]的值;否则赋值为空数组
  data.multiArray[2] = areaArr.length > 0 ? areaArr : [];
 } else {
  //如果第二列“市”的个数不大于0,那么第二列“市”和第三列“区”都赋值为空数组
  //直辖市citys = null,直接赋值areas
  data.multiArray[1] = [];
  data.multiArray[2] = temp[data.multiIndex[0]].areas || [];
 }
 this.setData({
  multiArray: data.multiArray,
  multiIndex: data.multiIndex,
 });
 }
// 点击确定时 修改显示
bindMultiPickerChange: function(e) {
 let {
  multiArray,multiIndex
 } = this.data;
 let provinceName,
  cityName,
  districtName,
  provinceId,
  cityId,
  districtId;
 provinceName = multiArray[0][multiIndex[0]].name;
 cityName = multiArray[1].length > 0 ? multiArray[1][multiIndex[1]].name : '';
 districtName = multiArray[2].length > 0 ? multiArray[2][multiIndex[2]].name : '';
 provinceId = multiArray[0][multiIndex[0]].code;
 cityId = multiArray[1].length > 0 ? multiArray[1][multiIndex[1]].code : '';
 districtId = multiArray[2].length > 0 ? multiArray[2][multiIndex[2]].code : '';
 this.setData({
  provinceName,
  cityName,
  districtName,
  provinceId,
  cityId,
  districtId,
  region: provinceName + cityName + districtName,
  showBottom:false
 })
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery EasyUI 开源插件套装 完全替代ExtJS
Mar 24 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
Feb 02 Javascript
js中通过split函数分割字符串成数组小例子
Sep 21 Javascript
jQuery性能优化技巧分析
Feb 20 Javascript
JavaScript内存管理介绍
Mar 13 Javascript
jquery动态遍历Json对象的属性和值的方法
Jul 27 Javascript
js的OOP继承实现(必看篇)
Feb 18 Javascript
Vue.js常用指令的使用小结
Jun 23 Javascript
JavaScript中.min.js和.js文件的区别讲解
Feb 13 Javascript
推荐一个基于Node.js的表单验证库
Feb 15 Javascript
Node.js 实现远程桌面监控的方法步骤
Jul 02 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
微信小程序实现canvas分享朋友圈海报
Jun 21 #Javascript
微信小程序实现选择地址省市区三级联动
Jun 21 #Javascript
小程序Scroll-view上拉滚动刷新数据
Jun 21 #Javascript
jQuery 移除事件的方法
Jun 20 #jQuery
vue引入静态js文件的方法
Jun 20 #Javascript
详解Vue之计算属性
Jun 20 #Javascript
微信小程序实现多图上传
Jun 19 #Javascript
You might like
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
PHP数据缓存技术
2007/02/14 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
js删除所有的cookie的代码
2010/11/25 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
javascript数组详解
2014/10/22 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
vue.js 实现点击展开收起动画效果
2018/07/07 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
python中循环语句while用法实例
2015/05/16 Python
基于python实现微信模板消息
2015/12/21 Python
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
python select.select模块通信全过程解析
2017/09/20 Python
使用python实现链表操作
2018/01/26 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
python输入中文的实例方法
2020/09/14 Python
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
优秀团干部个人事迹
2014/05/29 职场文书
国庆节标语大全
2014/10/08 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
创业计划书之宠物店
2019/09/19 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS