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


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 相关文章推荐
javascript在一段文字中的光标处插入其他文字
Aug 26 Javascript
JS查看对象功能代码
Apr 25 Javascript
jquery text()要注意啦
Oct 30 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
Jul 04 Javascript
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
最好用的省市二级联动 原生js实现你值得拥有
Sep 22 Javascript
js浏览器本地存储store.js介绍及应用
May 13 Javascript
jquery实现聚光灯效果的方法
Feb 06 Javascript
jQuery实现底部浮动窗口效果
Sep 07 Javascript
node.js中的事件处理机制详解
Nov 26 Javascript
mpvue+vant app搭建微信小程序的方法步骤
Feb 11 Javascript
js实现中文实时时钟
Jan 15 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
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
Bootstrap页面标题Page Header的实现方法
2017/03/22 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
详解Python装饰器由浅入深
2016/12/09 Python
如何在python中使用selenium的示例
2017/12/26 Python
python+django+sql学生信息管理后台开发
2018/01/11 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
python文件拆分与重组实例
2018/12/10 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
Java面试题:为什么要用Java
2012/05/11 面试题
致200米运动员广播稿
2014/02/06 职场文书
化妆品促销方案
2014/02/24 职场文书
小浪底导游词
2015/02/12 职场文书
学生会部长竞选稿
2015/11/19 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
python使用BeautifulSoup 解析HTML
2022/04/24 Python
基于Python编写一个监控CPU的应用系统
2022/06/25 Python