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


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 相关文章推荐
一个对于js this关键字的问题
Jan 09 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
May 28 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
Jul 23 Javascript
JavaScript中的包装对象介绍
Jan 27 Javascript
jquery+正则实现统一的表单验证
Sep 20 Javascript
原生JS实现垂直手风琴效果
Feb 19 Javascript
使用JS代码实现俄罗斯方块游戏
Aug 03 Javascript
微信网页登录逻辑与实现方法
Apr 29 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
Jan 11 jQuery
原生JavaScript之es6中Class的用法分析
Feb 23 Javascript
JavaScript布尔运算符原理使用解析
May 06 Javascript
详解 TypeScript 枚举类型
Nov 02 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
JSON在PHP中的应用介绍
2012/09/08 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
xml分页+ajax请求数据源+dom取结果实例代码
2008/10/31 Javascript
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
原生js实现日历效果
2020/03/02 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
python求pi的方法
2014/10/08 Python
浅谈Python中数据解析
2015/05/05 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
python绘制多个子图的实例
2019/07/07 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
马来西亚户外装备商店:PTT Outdoor
2019/07/13 全球购物
请介绍一下Ant
2016/07/22 面试题
物业经理求职自我评价
2013/09/22 职场文书
简历自荐信
2013/12/02 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
JS 4个超级实用的小技巧 提升开发效率
2021/10/05 Javascript
Redis高可用集群redis-cluster详解
2022/03/20 Redis