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


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 相关文章推荐
WordPress 照片lightbox效果的运用几点
Jun 22 Javascript
jquery ajax提交整个表单元素的快捷办法
Mar 27 Javascript
js简单实现用户注册信息的校验代码
Nov 15 Javascript
Javascript函数式编程语言
Oct 11 Javascript
jQuery实现三级菜单的代码
May 09 Javascript
简单实现jQuery进度条轮播实例代码
Jun 20 Javascript
js本地图片预览实现代码
Oct 09 Javascript
vuejs使用递归组件实现树形目录的方法
Sep 30 Javascript
详解Vue中watch对象内属性的方法
Feb 01 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
Sep 19 Javascript
对Layer弹窗使用及返回数据接收的实例详解
Sep 26 Javascript
浅析vue中的provide / inject 有什么用处
Nov 10 Javascript
微信小程序实现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
php桌面中心(四) 数据显示
2007/03/11 PHP
php url路由入门实例
2014/04/23 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
PHP中echo和print的区别
2014/08/28 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
动态加载JavaScript文件的两种方法
2016/04/22 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
2017/07/03 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
Python SQLite3数据库操作类分享
2014/06/10 Python
Python简单日志处理类分享
2015/02/14 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
用Python配平化学方程式的方法
2019/07/20 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
Python面向对象编程基础实例分析
2020/01/17 Python
Python ORM框架Peewee用法详解
2020/04/29 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
车间组长岗位职责
2013/12/20 职场文书
校长寄语大全
2014/04/09 职场文书
学雷锋活动简报
2015/07/20 职场文书
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL