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


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移动div层-javascript 拖动层
Mar 22 Javascript
jquery星级插件、支持页面中多次使用
Mar 25 Javascript
JavaScript cookie的设置获取删除详解
Feb 11 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
Mar 31 Javascript
jquery简单实现图片切换效果的方法
May 12 Javascript
原生JS实现图片左右轮播
Dec 30 Javascript
深入解析Vue 组件命名那些事
Jul 18 Javascript
jQuery实现常见的隐藏与展示列表效果示例
Jun 04 jQuery
jQuery实现ajax的嵌套请求案例分析
Feb 16 jQuery
JavaScript事件冒泡机制原理实例解析
Jan 14 Javascript
vue使用screenfull插件实现全屏功能
Sep 17 Javascript
javascript实现搜索筛选功能实例代码
Nov 12 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中的MVC模式运用技巧
2007/05/03 PHP
php 数组使用详解 推荐
2011/06/02 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
jQuery遮罩层实例讲解
2017/05/11 jQuery
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
在vue中实现某一些路由页面隐藏导航栏的功能操作
2020/09/21 Javascript
[07:57]DOTA2热力大趴狂欢夜 广州站活动回顾
2013/11/27 DOTA
Numpy数组转置的两种实现方法
2018/04/17 Python
对Python中的@classmethod用法详解
2018/04/21 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
python 实现两个线程交替执行
2020/05/02 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
爷爷追悼会答谢词
2014/01/24 职场文书
安全生产检查通报
2014/01/29 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
JavaScript实现简单图片切换
2021/04/29 Javascript