github項目地址 https://github.com/z1511676208/chooseAddr
序:項目中需要用到三級聯動,自己試着寫了下,也查了一些資料,現在把這個記錄一下,里面地區數據,可根據個人需要做一些更改,我比較懶就不改了。
wxml
<!--index.wxml--> <view class="infoText">{{province}} {{city}} {{county}}</view> <view class="aaaa" > <button class="animation-button" bindtap="translate">選擇城市</button> </view> <view class="animation-element-wrapper" animation="{{animation}}" style="visibility:{{show ? 'visible':'hidden'}}" bindtap="hiddenFloatView" data-id="444"> <view class="animation-element" catchtap="nono"> <text class="left-bt" catchtap="hiddenFloatView" data-id="555">取消</text> <text class="right-bt" catchtap="hiddenFloatView" data-id="666">確定</text> <view class="line"></view> <picker-view indicator-style = "height: 50rpx;" value="{{value}}" bindchange="bindChange" catchtap="nono"> <!--省--> <picker-view-column> <view wx:for="{{provinces}}" wx:for-item="sheng" wx:key=""> {{sheng.name}} </view> </picker-view-column> <!--地級市--> <picker-view-column> <view wx:for="{{citys}}" wx:key=""> {{item.name}} </view> </picker-view-column> <!--區縣--> <picker-view-column> <view wx:for="{{countys}}" wx:key=""> {{item.name}} </view> </picker-view-column> </picker-view> </view> </view>
js
//index.js //獲取應用實例 // var app = getApp() // var util = require('../../utils/util.js') var area = require('../../utils/area.js') var areaInfo = [];//所有省市區縣數據 var provinces = [];//省 var citys = [];//城市 var countys = [];//區縣 var index = [0, 0, 0]; var cellId; var t = 0; var show = false; var moveY = 200; Page({ data: { show: show, provinces: provinces, citys: citys, countys: countys, value: [0, 0, 0] }, //滑動事件 bindChange: function (e) { var val = e.detail.value // console.log(e) //判斷滑動的是第幾個column //若省份column做了滑動則定位到地級市和區縣第一位 if (index[0] != val[0]) { val[1] = 0; val[2] = 0; getCityArr(val[0], this);//獲取地級市數據 getCountyInfo(val[0], val[1], this);//獲取區縣數據 } else { //若省份column未做滑動,地級市做了滑動則定位區縣第一位 if (index[1] != val[1]) { val[2] = 0; getCountyInfo(val[0], val[1], this);//獲取區縣數據 } } index = val; console.log(index + " => " + val); //更新數據 this.setData({ value: [val[0], val[1], val[2]], province: provinces[val[0]].name, city: citys[val[1]].name, county: countys[val[2]].name }) }, onLoad: function (options) { cellId = options.cellId; var that = this; var date = new Date() console.log(date.getFullYear() + "年" + (date.getMonth() + 1) + "月" + date.getDate() + "日"); //獲取省市區縣數據 area.getAreaInfo(function (arr) { areaInfo = arr; //獲取省份數據 getProvinceData(that); }); }, // ------------------- 分割線 -------------------- onReady: function () { this.animation = wx.createAnimation({ transformOrigin: "50% 50%", duration: 0, timingFunction: "ease", delay: 0 } ) this.animation.translateY(200 + 'vh').step(); this.setData({ animation: this.animation.export(), show: show }) }, //移動按鈕點擊事件 translate: function (e) { if (t == 0) { moveY = 0; show = false; t = 1; } else { moveY = 200; show = true; t = 0; } // this.animation.translate(arr[0], arr[1]).step(); animationEvents(this,moveY, show); }, //隱藏彈窗浮層 hiddenFloatView(e){ console.log(e); moveY = 200; show = true; t = 0; animationEvents(this,moveY, show); }, //頁面滑至底部事件 onReachBottom: function () { // Do something when page reach bottom. }, tiaozhuan(){ wx.navigateTo({ url: '../../pages/modelTest/modelTest', }) } }) //動畫事件 function animationEvents(that,moveY,show){ console.log("moveY:" + moveY + "\nshow:" + show); that.animation = wx.createAnimation({ transformOrigin: "50% 50%", duration: 400, timingFunction: "ease", delay: 0 } ) that.animation.translateY(moveY + 'vh').step() that.setData({ animation: that.animation.export(), show: show }) } // ---------------- 分割線 ---------------- //獲取省份數據 function getProvinceData(that) { var s; provinces = []; var num = 0; for (var i = 0; i < areaInfo.length; i++) { s = areaInfo[i]; if (s.di == "00" && s.xian == "00") { provinces[num] = s; num++; } } that.setData({ provinces: provinces }) //初始化調一次可更改 getCityArr(0, that); getCountyInfo(0, 0, that); that.setData({ province: "北京市", city: "市轄區", county: "東城區", }) } // 獲取地級市數據 function getCityArr(count, that) { var c; citys = []; var num = 0; for (var i = 0; i < areaInfo.length; i++) { c = areaInfo[i]; if (c.xian == "00" && c.sheng == provinces[count].sheng && c.di != "00") { citys[num] = c; num++; } } if (citys.length == 0) { citys[0] = { name: '' }; } that.setData({ city: "", citys: citys, value: [count, 0, 0] }) } // 獲取區縣數據 function getCountyInfo(column0, column1, that) { var c; countys = []; var num = 0; for (var i = 0; i < areaInfo.length; i++) { c = areaInfo[i]; if (c.xian != "00" && c.sheng == provinces[column0].sheng && c.di == citys[column1].di) { countys[num] = c; num++; } } if(countys.length == 0){ countys[0] = {name:''}; } that.setData({ county: "", countys: countys, value: [column0, column1, 0] }) }
wxss
/**index.wxss**/ page{ background-color: rgba(255, 255, 255, 1); } .infoText{ margin-top: 20rpx; text-align: center; width: 100%; justify-content: center; } picker-view{ background-color: white; padding: 0; width: 100%; height: 380rpx; bottom: 0; position: fixed; } picker-view-column view{ vertical-align:middle; font-size: 28rpx; line-height: 28rpx; height: 100%; display: flex; align-items: center; justify-content: center; } /* ----------------------------------------- */ .animation-element-wrapper { display: flex; position: fixed; left: 0; top:0; height: 100%; width: 100%; background-color: rgba(0, 0, 0, 0.6); } .animation-element { display: flex; position: fixed; width: 100%; height: 470rpx; bottom: 0; background-color: rgba(255, 255, 255, 1); } .animation-button { margin-top: 20rpx; top:20rpx; width: 400rpx; height: 100rpx; line-height: 100rpx; align-items:center; } text{ color: #999999; display: inline-flex; position: fixed; margin-top: 20rpx; height: 50rpx; text-align: center; line-height: 50rpx; font-size: 34rpx; font-family: Arial, Helvetica, sans-serif; } .left-bt{ left: 30rpx; } .right-bt { right: 30rpx; } .line{ display: block; position: fixed; height: 1rpx; width: 100%; margin-top: 89rpx; background-color: #eeeeee; }
這個是沒有進行封裝的處理
項目里已經封裝好,可直接通過模板調用使用。