>  기사  >  위챗 애플릿  >  미니 프로그램 개발-선택기 다단계 연결

미니 프로그램 개발-선택기 다단계 연결

零下一度
零下一度원래의
2018-05-16 11:06:517961검색

최근 농약에 중독되어 헤어나지 못하고 있습니다. 먼저 제 자신을 돌아보겠습니다...
우선 오늘 해야 할 일에 대해 말씀드리겠습니다. 아래 사진은 얼마전 APP에 고객불만 기능이 추가되었습니다.

미니 프로그램 개발-선택기 다단계 연결

iOS.gif

보시다시피 선택기의 다중 레벨 연결이 포함됩니다(여기서는 단 두 레벨). 그런데 지난 수요일에 회사의 미니프로그램을 인수하게 되었는데, 미니프로그램이라고 하는데 실제로는 2~3페이지 정도만 APP에서 '하고 싶다' 등의 기능을 추가해달라는 요청을 받았습니다. 불평" 페이지를 참조하세요. 안드로이드 셀렉터 효과를 종합적으로 검토한 후 아래와 같이 미니 프로그램에 만들어서 효과를 살펴보세요.

미니 프로그램 개발-선택기 다단계 연결

미니 프로그램 .gif

이 페이지에 필요한 파일에 대해 간단히 말씀드리자면,

미니 프로그램 개발-선택기 다단계 연결

필수파일.png

예, 매 미니 프로그램의 페이지에는 프런트 엔드 "삼총사"와 마찬가지로 .js/.json/.wxml/.wxss 파일이 필요합니다. 여기에는 사총사가 있지만 실제로는 .json이 필요하지 않습니다. 그래도 삼총사... 미니 프로그램에 대해서는 주제에 대해 너무 많이 다루지 않겠습니다. 미니 프로그램에 관심이 있으시면 저에게 비공개 메시지를 보내 논의하실 수 있습니다.
아래에서 X 설치를 시작하세요.
UI의 레이아웃, 즉 .wxml과 .wxss부터 시작합니다(다단계 연결 부분만 제공)

.wxml

    <view class="section" >  
        <view style="   display : flex;flex-direction : row;">
        <text class=" text">选择购买门店:</text><text bindtap="cascadePopup" style= " color: #393939;font-size: 32rpx;margin-top : 2px; margin-left:8px;">{{areaSelectedStr}}></text>
        </view>
        <text style= " color: #393939;font-size: 32rpx;margin-top : 4px;margin-left:114px;">{{detailAddress}}</text>

    </view> 

//选择器
    <view class="modal">
    <view class="modal-mask {{maskVisual}}" bindtap="cascadeDismiss"></view>
    <view animation="{{animationData}}" class="modal-content">
        <view class="modal-header">
            <text class="modal-title">请选择门店</text>
            <text class="modal-close" bindtap="cascadeDismiss">X</text>
        </view>
        <view class="modal-body">

            <text class="viewpager-title {{current == 0 ? &#39;area-selected&#39; : &#39;&#39;}}" bindtap="changeCurrent" data-current="0">{{areaName}}</text>
            <text class="viewpager-title {{current == 1 ? &#39;area-selected&#39; : &#39;&#39;}}" bindtap="changeCurrent" data-current="1">{{shopName}}</text>
            <text class="viewpager-title {{current == 2 ? &#39;area-selected&#39; : &#39;&#39;}}" bindtap="changeCurrent" data-current="2">{{detailAddress}}</text>

            <view class="viewpager-pider"></view>
            <swiper class="swiper-area" current="{{current}}" bindchange="currentChanged">

                <block wx:if="{{area_arr.length > 0}}">
                    <swiper-item>
                        <scroll-view scroll-y="true" class="viewpager-listview">
                            <view wx:for="{{area_arr}}" wx:key="index" data-index="{{index}}" bindtap="areaTapped">
                                <text wx:if="{{index == areaIndex}}" class="area-selected">{{item}}</text>
                                <text wx:else>{{item}}</text>
                            </view>
                        </scroll-view>
                    </swiper-item>
                </block>

                <block wx:if="{{shop_arr.length > 0}}">
                    <swiper-item>
                        <scroll-view scroll-y="true" class="viewpager-listview">
                            <view wx:for="{{shop_arr}}" wx:key="index" data-index="{{index}}" bindtap="shopTapped">
                                <text wx:if="{{index == shopIndex}}" class="area-selected">{{item}}</text>
                                <text wx:else>{{item}}</text>
                            </view>
                        </scroll-view>
                    </swiper-item>
                </block>

              <block wx:if="{{detailAddress_tempArr.length > 0}}">
                    <swiper-item>
                        <scroll-view scroll-y="true" class="viewpager-listview">
                            <view wx:for="{{detailAddress_tempArr}}" wx:key="index" data-index="{{index}}" bindtap="detailAddressTapped">
                                <text wx:if="{{index == detailIndex}}" class="area-selected">{{item}}</text>
                                <text wx:else>{{item}}</text>
                            </view>
                        </scroll-view>
                    </swiper-item>
                </block>

            </swiper>
        </view>
    </view>
</view>

.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: &#39;请选择门店&#39;,//area_arr[index]+shop_arr[index]  用来显示于wxml中
    maskVisual: &#39;hidden&#39;,
    areaName: &#39;请选择&#39;,//显示于选择器上面部分的区域名
    detailAddress:&#39;可在小票上查看门店&#39;,//用来显示于wxml
    source: &#39;&#39;

  },
  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: &#39;提示&#39;,
                        content: userInfo.getMessage(),
                        success: function(res) {
                            if (res.confirm) {
                                console.log(&#39;用户点击确定&#39;)
                            }
                        }

                    })
                }
          }else {
                if(userInfo.is401()){
                    wx.showModal({
                            title: &#39;提示&#39;,
                            content: &#39;请先登录&#39;,
                            success: function(res) {
                                if (res.confirm) {
                                    console.log(&#39;用户点击确定&#39;)
                                }
                            }
                        })
                  }else if(userInfo.is404()){
                    wx.showModal({
                            title: &#39;提示&#39;,
                            content: &#39;页面找不到啦&#39;,
                            success: function(res) {
                                if (res.confirm) {
                                    console.log(&#39;用户点击确定&#39;)
                                }
                            }

                        })
                    }else if(userInfo.is500()){
                    wx.showModal({
                            title: &#39;提示&#39;,
                            content: &#39;服务器又开小差啦&#39;,
                            success: function(res) {
                                if (res.confirm) {
                                    console.log(&#39;用户点击确定&#39;)
                                }
                            }

                        })
                    }else{
                    wx.showModal({
                            title: &#39;提示&#39;,
                            content: userInfo.getMessage(),
                            success: function(res) {
                                if (res.confirm) {
                                    console.log(&#39;用户点击确定&#39;)
                                }
                            }

                        })
                    }

                }
            } 
     ) 

},

  //...
  //点击选择门店弹出选择器
  cascadePopup: function() {
        var animation = wx.createAnimation({
            duration: 500,
            timingFunction: &#39;ease-in-out&#39;,
        });
        this.animation = animation;
        animation.translateY(-285).step();
        this.setData({
            animationData: this.animation.export(),
            maskVisual: &#39;show&#39;
        });
    },
//关闭选择器
 cascadeDismiss: function () {
        this.animation.translateY(285).step();
        this.setData({
            animationData: this.animation.export(),
            maskVisual: &#39;hidden&#39;
        });
    },


 //...



 //地址选择

 areaTapped: function(e) {
        // 标识当前点击第一级中的哪个区域,记录其名称与主键id都依赖它
        var index = e.currentTarget.dataset.index;
        // current为1,使得页面向左滑动一页至商场列表
        // areaIndex是商场数据的标识
        if(this.data.area_arr[index] == &#39;未知门店&#39;){
           this.setData({
            areaName: this.data.area_arr[index],
            shopName: &#39;&#39;,
            shop_arr:[],
            detailAddress:&#39;暂无详细地址&#39;,
            detailAddress_tempArr:[],
            areaSelectedStr: this.data.area_arr[index] +  &#39;     &#39;,
           });
         this.cascadeDismiss();

        }else{
            this.setData({
                areaName: this.data.area_arr[index],
                shopName: &#39;&#39;,
                detailAddress:&#39;选择门店后显示详细地址&#39;,
                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:&#39;请选择&#39;,
                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. 이해가 안 되는 부분이 있으면 개인 메시지를 보내주세요. .

[관련 추천]

1. 위챗 미니 프로그램 전체 소스코드 다운로드

위챗 미니 프로그램 게임 데모 다양한 색상 블록 선택

3. WeChat 미니 프로그램 데모: Yangtao

위 내용은 미니 프로그램 개발-선택기 다단계 연결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.