### [小程序开发--选择器多级联动](https://www.prosaas.cn/article/17597) **Published:** 2018-05-16T03:06:51 **Author:** 5201314 **Excerpt:** 近段时间由于一直沉迷王者农药无法自拔,在这先自我检讨...首先说下今天要做的需求:如下图,是前段时间给APP中… 近段时间由于一直沉迷王者农药无法自拔,在这先自我检讨... 首先说下今天要做的需求:如下图,是前段时间给APP中添加的客诉功能。 ![](//upload-images.jianshu.io/upload_images/2264456-ef01adb1f73d948e.gif?imageMogr2/auto-orient/strip) iOS.gif 能看到,里面涉及到了选择器多级联动(这里就两级)。然而,上星期三的时候接手了公司的小程序,说是小程序,其实也就两三个页面,要我把APP上的功能加上去,其中包括这个“我要投诉”的页面,综合了下安卓的选择器效果,下面看小程序上做出后的效果如下图: ![](//upload-images.jianshu.io/upload_images/2264456-df8cf8ff75f292d0.gif?imageMogr2/auto-orient/strip) 小程序.gif 先大致说下这个页面的所需文件, ![](//upload-images.jianshu.io/upload_images/2264456-60bb8f24c1a588fd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 所需文件.png 是的,小程序的每个页面都需要.js/.json/.wxml/.wxss文件,就像前端 "三剑客"一样,这里是四剑客,但.json其实也是可有可无的,本质上还是三剑客...关于小程序的话题不多说了,对小程序感兴趣的可以私信我讨论哈。 下面开始装X。 先从布局UI开始,也就是 .wxml 和 .wxss(只给出多级联动的部分) #### .wxml 选择购买门店:{{areaSelectedStr}}> {{detailAddress}} //选择器 请选择门店 X {{areaName}} {{shopName}} {{detailAddress}} {{item}} {{item}} {{item}} {{item}} {{item}} {{item}} #### .wxss .section{ background:white; margin:2px; padding:20rpx; display : flex; flex-direction : column; } .text{ color: #393939; font-size: 32rpx; margin-top : 2px; } /\*跳出的选择器\*/ .modal-content { position: fixed; bottom: -285px; left: 0; width: 100%; height: 285px; /\*box-shadow: 10rpx 0 30rpx rgba(0,0,0,.9);\*/ margin-top: 5px; background: #fff; z-index: 999; } /\*遮罩层\*/ .modal-mask { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: #000; opacity: .8; z-index: 99; } /\*弹窗头部\*/ .modal-header { margin: 2px 0; font-size: 16px; color: #666; display: flex; flex-direction: row; justify-content: space-between; line-height: 30px; } /\*所在地区字样\*/ .modal-title { text-align: center; width: 100%; } /\*关闭按钮\*/ .modal-close { width: 20px; } .modal-body { font-size: 14px; } /\*每级地区标题\*/ .viewpager-title { padding: 0 10px; /\*color: #f03118;\*/ line-height: 30px; } /\*分隔线\*/ .viewpager-pider { width: 100%; height: 1px; background: #ccc; } /\*左右滑动控件\*/ .swiper-area { height:220px; } /\*地址列表ListView容器\*/ .viewpager-listview { padding-top: 5px; height: 100%; } /\*每行地址item项\*/ .viewpager-listview view{ line-height: 30px; padding: 0 10px; } /\*高亮当前所选地区\*/ .area-selected { color: red; } /\*初始隐藏\*/ .hidden { display: none; } /\*运行时显示\*/ .show { display: block; } #### .js文件 var UserInfo = require("../../../js/bean/UserInfo.js"); var ApiUser = require("../../../js/http/ApiUser.js"); var shopss = \[\]; var detailAddress\_arr = \[\]; Page({ data: { //购买门店 current:0, //选择器第几页的标识,对应wxml中的current shopList:\[\], area\_arr:\[\],//第一级的数据数组 area\_id:\[\], shop\_arr:\[\],//第二级的数据数组 shop\_id:\[\], detailAddress\_tempArr:\[\],//第三级的数据数组 areaSelectedStr: '请选择门店',//area\_arr\[index\]+shop\_arr\[index\] 用来显示于wxml中 maskVisual: 'hidden', areaName: '请选择',//显示于选择器上面部分的区域名 detailAddress:'可在小票上查看门店',//用来显示于wxml source: '' }, onLoad:function(options){ page = this; this.loadPreData();//加载选择器中的数据 }, //加载平台、门店、投诉类型 loadPreData:function(){ var that = this; ApiUser.getpreData(function (resp) { var userInfo = new UserInfo(resp); if(userInfo.isOK()){ if (userInfo.isSuccess()){ //平台 //... //投诉类型 //... // 购买门店 var area\_arr = \[\], area\_id = \[\]; userInfo.getData().shopsList.forEach(function(e){ area\_arr.push(e.area); area\_id.push(e.areaId); shopss.push(e.shops); }) that.setData({ //... shopList:userInfo.getData().shopsList, area\_arr:area\_arr, area\_id:area\_id }) }else { wx.showModal({ title: '提示', content: userInfo.getMessage(), success: function(res) { if (res.confirm) { console.log('用户点击确定') } } }) } }else { if(userInfo.is401()){ wx.showModal({ title: '提示', content: '请先登录', success: function(res) { if (res.confirm) { console.log('用户点击确定') } } }) }else if(userInfo.is404()){ wx.showModal({ title: '提示', content: '页面找不到啦', success: function(res) { if (res.confirm) { console.log('用户点击确定') } } }) }else if(userInfo.is500()){ wx.showModal({ title: '提示', content: '服务器又开小差啦', success: function(res) { if (res.confirm) { console.log('用户点击确定') } } }) }else{ wx.showModal({ title: '提示', content: userInfo.getMessage(), success: function(res) { if (res.confirm) { console.log('用户点击确定') } } }) } } } ) }, //... //点击选择门店弹出选择器 cascadePopup: function() { var animation = wx.createAnimation({ duration: 500, timingFunction: 'ease-in-out', }); this.animation = animation; animation.translateY(-285).step(); this.setData({ animationData: this.animation.export(), maskVisual: 'show' }); }, //关闭选择器 cascadeDismiss: function () { this.animation.translateY(285).step(); this.setData({ animationData: this.animation.export(), maskVisual: 'hidden' }); }, //... //地址选择 areaTapped: function(e) { // 标识当前点击第一级中的哪个区域,记录其名称与主键id都依赖它 var index = e.currentTarget.dataset.index; // current为1,使得页面向左滑动一页至商场列表 // areaIndex是商场数据的标识 if(this.data.area\_arr\[index\] == '未知门店'){ this.setData({ areaName: this.data.area\_arr\[index\], shopName: '', shop\_arr:\[\], detailAddress:'暂无详细地址', detailAddress\_tempArr:\[\], areaSelectedStr: this.data.area\_arr\[index\] + ' ', }); this.cascadeDismiss(); }else{ this.setData({ areaName: this.data.area\_arr\[index\], shopName: '', detailAddress:'选择门店后显示详细地址', areaIndex: index, shopIndex:-1 }); var that = this; //todo 商场列表赋值 var shop\_arr = \[\], shop\_id = \[\]; shopss\[index\].forEach(function(e){ shop\_arr.push(e.shopName); shop\_id.push(e.shopId); detailAddress\_arr.push(e.address); }) that.setData({ shopName:'请选择', shop\_arr:shop\_arr, shop\_id: shop\_id, }); that.setData({ current:1 }); } }, //点击第二级的商场事件,同理上面点击第一级 shopTapped: function (e) { var index = e.currentTarget.dataset.index; this.setData({ shopIndex: index, shopName: this.data.shop\_arr\[index\] }); var areaSelectedStr = this.data.areaName +" "+ this.data.shopName ; this.setData({ areaSelectedStr: areaSelectedStr, detailAddress:detailAddress\_arr\[index\] }); var detailAddress\_tempArr = \[\]; detailAddress\_tempArr.push(detailAddress\_arr\[index\]); this.setData({ current:2, detailAddress\_tempArr:detailAddress\_tempArr }); }, //点击第三级的详细地址事件,并关闭选择器 detailAddressTapped : function (e) { this.cascadeDismiss(); }, currentChanged: function (e) { // swiper滚动使得current值被动变化,用于高亮标记 var current = e.detail.current; this.setData({ current: current }); }, changeCurrent: function (e) { // 记录点击的标题所在的区级级别 var current = e.currentTarget.dataset.current; this.setData({ current: current }); }, onReady:function(){ // 页面渲染完成 }, onShow:function(){ // 页面显示 }, onHide:function(){ // 页面隐藏 }, onUnload:function(){ // 页面关闭 } }) 这方面的文章是第一次写,可能可读性较差0.0 有哪些不懂的可以私信我。 【相关推荐】 1\. 微信小程序完整源码下载 2. 微信小程序游戏类demo挑选不同色块 3. 微信小程序demo:阳淘 以上就是小程序开发--选择器多级联动的详细内容,更多请关注知企PROSAAS其它相关文章! **Tags:** ios, JS, json, ui, 微信小程序, 选择器 **Categories:** 后端开发 ---