小程序--三級聯動html
最近作的項目中須要添加三級聯動,選擇所在地,而其中三級聯動是自定義的,因此選擇多列選擇器。小程序
小程序關於picker的官方文檔:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html數組
效果圖:數據結構
關於wxml頁面很簡單,就一行代碼,相關的屬性能夠看文檔來本身定義,這裏簡單說明一下是如何渲染的,以及渲染過程當中出現的問題。函數
wxml:this
<picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" range="{{multiArray}}"> <view> {{multiSelect}} </view> </picker>
經過接口返回的數據結構以下圖:spa
如此可見返回的是對象,須要轉換成數組纔可在頁面上渲染debug
由於後期會屢次用到對象轉換爲數組,將此封裝爲一個函數code
js:component
//將js對象變爲數組--三級聯動 toArr(object) { //object要遍歷的對象 name--我須要的數據,可自定義 var arr = [];//返回的數組 for (var i in object) { arr.push(object[i].name); //屬性 } return arr; }
在轉換數組的過程當中,須要找到相應的某一項下面的全部數據,因此在此基礎上添加查找某一項的功能
js:
//將js對象變爲數組--三級聯動 toArr(object, findItem) { //object要遍歷的對象 findItem查找項 var nameList = [];//返回的數組 var itemList = []; var allMessage; for (var i in object) { nameList.push(object[i].name); //屬性 if (findItem && object[i].name == findItem) { //遍歷對象,找到findItem的全部數據 itemList = object[i]; } } if (findItem){ allMessage = { 'nameList': nameList, 'itemList': itemList } }else{ allMessage = { 'nameList': nameList} } return allMessage; }
準備工做作完,將獲取到到數據整理出來
js:
data: {
multiArray: [], //國家省份三級聯動數組 objectMultiArray:'', //中國省份數組 countriesShowList: [], //展現的國家數組 provincesShowList:[], //展現的省份數組 citiesShowList:[], //展現的地區數組 provincesShow:false, //是否第一次渲染省份數組 multiSelect: '>', //選中的所在地 },
// 獲取三級聯動數據 brm.brm_request(接口地址) 發送request請求 .then(function (res) { var arr = that.toArr(res.data, "中國") console.log(res.data) that.setData({ multiArray: [arr.nameList, ['——'], ['——']], objectMultiArray: arr.itemList, countriesShowList: arr.nameList }) }, function (err) { });
//城市三級聯動選中 bindMultiPickerChange: function (e) { var index = e.detail.value; var arr; if (index[0] == 36){ //選中中國 if(index[1]== null){ if (this.data.citiesShowList[index[2]]&&this.data.citiesShowList[index[2]] != '——'){ arr = this.data.countriesShowList[index[0]] + ',' + this.data.provincesShowList[0] + ',' + this.data.citiesShowList[index[2]] }else{ arr = this.data.countriesShowList[index[0]] + ',' + this.data.provincesShowList[0] } }else{ if (this.data.citiesShowList[index[2]] && this.data.citiesShowList[index[2]] != '——') { arr = this.data.countriesShowList[index[0]] + ',' + this.data.provincesShowList[index[1]] + ',' + this.data.citiesShowList[index[2]] } else { arr = this.data.countriesShowList[index[0]] + ',' + this.data.provincesShowList[index[1]] } } } else { arr = this.data.countriesShowList[index[0]] } this.setData({ multiSelect: arr }) }
//三級聯動城市改變 bindMultiPickerColumnChange: function (e) { var provincesList = this.data.objectMultiArray.provinces; //省份 var provincesArr = this.toArr(provincesList).nameList; //省份數組 //移動第一列時,選中中國的狀況 if (e.detail.column == 0 && e.detail.value == 36){ this.setData({ multiArray: [this.data.multiArray[0], provincesArr, ['——']], provincesShowList:provincesArr, provincesShow:true }) } else if (e.detail.column == 0 && e.detail.value != 36){ //選中非中國的國家狀況 this.setData({ multiArray: [this.data.multiArray[0], ['——'], ['——']] }) } //移動第二列,選中相應的省份顯示地區 if (e.detail.column == 1 && this.data.provincesShow){ var findProvincesList = this.toArr(provincesList, provincesArr[e.detail.value]); //provincesArr[e.detail.value] 當前選中的省份 var findCitiesList = this.toArr(findProvincesList.itemList.cities); //當前選中省份的地區數組 var citiesList ; if (findCitiesList.nameList.length > 0){ //當前省份是否有城市 citiesList = findCitiesList.nameList; }else{ citiesList = ['——']; } this.setData({ multiArray: [this.data.multiArray[0], provincesArr, citiesList], citiesShowList: citiesList }) } }
在渲染過程當中,遇到的問題:
1.進入頁面後,會默認執行了bindcolumnchange事件,而且每一列都移動一次;因此在bindMultiPickerColumnChange函數中,就會執行「移動第二列,選中相應的省份顯示地區」,因此在這裏須要給它加一個標識this.data.provincesShow
2.默認選中中國後,不移動第二列,那第二列返回的移動數據爲null;多處理一次爲null時的狀況