小程序--三級聯動


小程序--三級聯動

最近做的項目中需要添加三級聯動,選擇所在地,而其中三級聯動是自定義的,所以選擇多列選擇器。

小程序關於picker的官方文檔:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html

效果圖:

 

 

 

 

關於wxml頁面很簡單,就一行代碼,相關的屬性可以看文檔來自己定義,這里簡單說明一下是如何渲染的,以及渲染過程中出現的問題。

wxml:

復制代碼
<picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" range="{{multiArray}}"> <view> {{multiSelect}} </view> </picker>
復制代碼

通過接口返回的數據結構如下圖:

如此可見返回的是對象,需要轉換成數組才可在頁面上渲染

因為后期會多次用到對象轉換為數組,將此封裝為一個函數

js:

復制代碼
  //將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時的情況


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM