### [小程序开发--选择器多级联动](https://www.prosaas.cn/article/17597)
**Published:** 2018-05-16T03:06:51
**Author:** 5201314
**Excerpt:** 近段时间由于一直沉迷王者农药无法自拔,在这先自我检讨...首先说下今天要做的需求:如下图,是前段时间给APP中…
近段时间由于一直沉迷王者农药无法自拔,在这先自我检讨...
首先说下今天要做的需求:如下图,是前段时间给APP中添加的客诉功能。

iOS.gif
能看到,里面涉及到了选择器多级联动(这里就两级)。然而,上星期三的时候接手了公司的小程序,说是小程序,其实也就两三个页面,要我把APP上的功能加上去,其中包括这个“我要投诉”的页面,综合了下安卓的选择器效果,下面看小程序上做出后的效果如下图:

小程序.gif
先大致说下这个页面的所需文件,

所需文件.png
是的,小程序的每个页面都需要.js/.json/.wxml/.wxss文件,就像前端 "三剑客"一样,这里是四剑客,但.json其实也是可有可无的,本质上还是三剑客...关于小程序的话题不多说了,对小程序感兴趣的可以私信我讨论哈。
下面开始装X。
先从布局UI开始,也就是 .wxml 和 .wxss(只给出多级联动的部分)
#### .wxml
选择购买门店:{{areaSelectedStr}}>
{{detailAddress}}
//选择器
#### .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:** 后端开发
---