微信小程序-官方組件picker云開發(fā)省市區(qū)三級聯(lián)動選擇器

早在一年多以前,我寫過一篇微信小程序-省市區(qū)縣三級聯(lián)動選擇器的文章稠肘,那時候小程序剛起步福铅,網(wǎng)上找了很久沒有相關的文獻,官方也沒有相關的組件项阴,我就自己動手寫了一個滑黔,也因為剛開始接觸寫的不是很好。
當時省市區(qū)的數(shù)據(jù)我是在網(wǎng)上找的一個json文檔,然后把里面的json數(shù)據(jù)復制出來略荡,在js文件里寫了一個方法用數(shù)組接收復制出來的json數(shù)據(jù)色查,外部調(diào)用這個方法就直接返回這個數(shù)組,因為json數(shù)據(jù)有幾百k的占用撞芍,顯然不是很符合小程序的“小”的初衷。
最近無事跨扮,研究了下云開發(fā)序无,我就想把數(shù)據(jù)放在云端數(shù)據(jù)庫,重寫一下省市區(qū)三級聯(lián)動選擇器衡创。后來在查看小程序組件的時候發(fā)現(xiàn)帝嗡,現(xiàn)在官方組件picker專門為我們提供了"省市區(qū)選擇器"這個控件,假如單單只是需要文字形式的"省市區(qū)選擇器"璃氢,大家可以選用官方的哟玷,性能方面以及簡易方面應該更適合普通開發(fā)者,因為直接接入就行了一也,不用寫內(nèi)部復雜的邏輯巢寡。

圖1-官方省市區(qū)選擇器文檔說明

<!.wxml-->
<view class="section">
  <view class="section__title">省市區(qū)選擇器</view>
  <picker mode="region" bindchange="bindRegionChange" value="{{region}}" custom-item="{{customItem}}">
    <view class="picker">
      當前選擇:{{region[0]}},{{region[1]}}椰苟,{{region[2]}}
    </view>
  </picker>
</view>
//.js
//點擊確定按鈕
bindRegionChange: function (e) {
    console.log(e)
    console.log('picker發(fā)送選擇改變抑月,攜帶值為', e.detail.value)
    this.setData({
      region: e.detail.value
    })
  }

但是我們往往不只是需要e.detail.value里面的省市區(qū)名字,可能后臺只需要傳code就行了舆蝴。按圖1bingchange的屬性是有code的但是我打印e.detail.code發(fā)現(xiàn)是沒有code的谦絮。不知道是不是我版本的問題,反正打印除了e.detail.value有值postcode和code都是沒值的洁仗,那怎么辦呢层皱?沒值我就自己造值,從某接口獲取了一份數(shù)據(jù)赠潦,已經(jīng)按省市區(qū)三維數(shù)組處理好了叫胖,我存在了云數(shù)據(jù)庫里。
因為官方的"省市區(qū)選擇器"mode="region"里的數(shù)組是定死的由微信提供她奥,不能做更改臭家,好在同是piker組件mode="multiSelector"時提供了自定義的"多列選擇器":


圖2-多列選擇器

本文使用的數(shù)據(jù)結構大致如下:

[
  {
    "citys":[
              {
                 "areas":[
                           {
                             "code":"440303",
                             "name":"羅湖區(qū)"
                           },
                           {
                             "code":"440304",
                             "name":"福田區(qū)"
                           },   
                           ...
                         ],
                  "code":"440300",
                  "name":"深圳市"
               },
               ...
            ],
    "code":"440000",
    "name":"廣東省"
  },
  ...
]

屬性rang對應是最外層的整個數(shù)組,range-key指定選擇器上要顯示的內(nèi)容方淤,這里range-key="name"就會顯示中文內(nèi)容钉赁,假若range-key="code"顯示的就是code字段內(nèi)容了就是一串數(shù)字,眼尖的朋友應該知道其實這串數(shù)字就是身份證前六位携茂,通過它們的組合傳給后臺就可以定位省市區(qū)了你踩。
言歸正傳動手寫代碼:

<!--pages/getCityData/getCityData.wxml-->
<view class="section">
  <view class="section__title">多列選擇器</view>
  <picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}" range-key="name">
    <button class="picker">
      當前選擇:{{multiArray[0][multiIndex[0]].name}}({{multiArray[0][multiIndex[0]].code}}){{multiArray[1].length > 0 ?("," + multiArray[1][multiIndex[1]].name + "(" + multiArray[1][multiIndex[1]].code + ")"):""}}{{multiArray[2].length > 0 ?("," + multiArray[2][multiIndex[2]].name + "(" + multiArray[2][multiIndex[2]].code + ")"):""}}
    </button>
  </picker>
</view>
/* pages/getCityData/getCityData.wxss */

.picker{
    padding: 13px;
    background-color: #FFFFFF;
}
//pages/getCityData/getCityData.json
{
  "component": true,
  "usingComponents": {}
}

js文件中multiArray代表顯示的[省,市,區(qū)]數(shù)組带膜,multiIndex代表滑動后定位的下標數(shù)組吩谦。從數(shù)據(jù)庫獲取數(shù)據(jù)后通過[0,0,0]得到初始化的multiArray,通過滑動調(diào)用bindMultiPickerColumnChange方法得到新的數(shù)組下標數(shù)組膝藕,進而得到新的數(shù)據(jù)數(shù)組式廷。

// pages/getCityData/getCityData.js
Component({
  /**
   * 組件的屬性列表
   */
  properties: {

  },

  /**
   * 組件的初始數(shù)據(jù)
   */
  data: {
    multiArray: [],
    multiIndex: [0,0,0]
  },
  lifetimes: {
    // 生命周期函數(shù),可以為函數(shù)芭挽,或一個在methods段中定義的方法名
    attached: function () { 
      this.getCityInfo()
    }
  },
  /**
   * 組件的方法列表
   */
  methods: {
    //獲取數(shù)據(jù)庫數(shù)據(jù)
    getCityInfo: function(){
      wx.showLoading({
        title: 'Loading...',
      })
      const db = wx.cloud.database()
      //因為數(shù)據(jù)庫只存有一個總的數(shù)據(jù)字典滑废,所以指定它的ID直接獲取數(shù)據(jù)
      var that = this
      db.collection('cityDataArr').doc('5bdad6225f23a246bb2a97e1').get({
        success: res => {
          wx.hideLoading();
          if (res.data){
            //獲取云數(shù)據(jù)庫數(shù)據(jù)
            var temp = res.data.data;
            //初始化更新數(shù)據(jù)
            that.setData({
              provinces: temp,
              multiArray: [temp, temp[0].citys, temp[0].citys[0].areas],
              multiIndex: [0, 0, 0]
            })
            console.log(that.data.provinces)
          }
        },
        fail: err => {
          wx.hideLoading();
          console.error(err)
        }
      })     
    },
    //點擊確定
    bindMultiPickerChange: function (e) {
      console.log('picker發(fā)送選擇改變,攜帶值為', e.detail.value)
      this.setData({
        multiIndex: e.detail.value
      })
    },
    //滑動
    bindMultiPickerColumnChange: function(e){
      console.log('修改的列為', e.detail.column, '袜爪,值為', e.detail.value);
      var data = {
        multiArray: this.data.multiArray,
        multiIndex: this.data.multiIndex
      };
      //更新滑動的第幾列e.detail.column的數(shù)組下標值e.detail.value
      data.multiIndex[e.detail.column] = e.detail.value;
      //如果更新的是第一列“省”蠕趁,第二列“市”和第三列“區(qū)”的數(shù)組下標置為0
      if (e.detail.column == 0){
        data.multiIndex = [e.detail.value,0,0];
      } else if (e.detail.column == 1){
        //如果更新的是第二列“市”,第一列“省”的下標不變辛馆,第三列“區(qū)”的數(shù)組下標置為0
        data.multiIndex = [data.multiIndex[0], e.detail.value, 0];
      } else if (e.detail.column == 2) {
        //如果更新的是第三列“區(qū)”俺陋,第一列“省”和第二列“市”的值均不變。
        data.multiIndex = [data.multiIndex[0], data.multiIndex[1], e.detail.value];
      }
      var temp = this.data.provinces;
      data.multiArray[0] = temp;
      if ((temp[data.multiIndex[0]].citys).length > 0){
        //如果第二列“市”的個數(shù)大于0,通過multiIndex變更multiArray[1]的值
        data.multiArray[1] = temp[data.multiIndex[0]].citys;
        var areaArr = (temp[data.multiIndex[0]].citys[data.multiIndex[1]]).areas;
        //如果第三列“區(qū)”的個數(shù)大于0,通過multiIndex變更multiArray[2]的值昙篙;否則賦值為空數(shù)組
        data.multiArray[2] = areaArr.length > 0 ? areaArr : [];
      }else{
        //如果第二列“市”的個數(shù)不大于0腊状,那么第二列“市”和第三列“區(qū)”都賦值為空數(shù)組
        data.multiArray[1] = [];
        data.multiArray[2] = [];
      }
      //data.multiArray = [temp, temp[data.multiIndex[0]].citys, temp[data.multiIndex[0]].citys[data.multiIndex[1]].areas];
      //setData更新數(shù)據(jù)
      this.setData(data);
    }
  }
})

注釋說明都在以上代碼中,至于最后怎么顯示?侍伞:multiArray[0][multiIndex[0]]寿酌,市:multiArray[1][multiIndex[1]],區(qū):multiArray[2][multiIndex[2]]硕蛹。得到的是object的字典鍵值對醇疼,需要顯示中文取.name,需要獲取編碼取.code法焰。

<!--pages/getCityData/getCityData.wxml-->
當前選擇:{{multiArray[0][multiIndex[0]].name}}({{multiArray[0][multiIndex[0]].code}}){{multiArray[1].length > 0 ?("秧荆," + multiArray[1][multiIndex[1]].name + "(" + multiArray[1][multiIndex[1]].code + ")"):""}}{{multiArray[2].length > 0 ?("," + multiArray[2][multiIndex[2]].name + "(" + multiArray[2][multiIndex[2]].code + ")"):""}}
圖3-最終效果

下面附上處理后的json數(shù)據(jù)cityDataArr.json埃仪,直接上傳到云數(shù)據(jù)庫即可乙濒。
未處理的plist文件cityDataArr.plist也一并附上 。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卵蛉,一起剝皮案震驚了整個濱河市颁股,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌傻丝,老刑警劉巖甘有,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異葡缰,居然都是意外死亡亏掀,警方通過查閱死者的電腦和手機忱反,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滤愕,“玉大人温算,你說我怎么就攤上這事〖溆埃” “怎么了注竿?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長魂贬。 經(jīng)常有香客問我巩割,道長,這世上最難降的妖魔是什么随橘? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮锦庸,結果婚禮上机蔗,老公的妹妹穿的比我還像新娘。我一直安慰自己甘萧,他們只是感情好萝嘁,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扬卷,像睡著了一般牙言。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怪得,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天咱枉,我揣著相機與錄音,去河邊找鬼徒恋。 笑死蚕断,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的入挣。 我是一名探鬼主播亿乳,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼径筏!你這毒婦竟也來了葛假?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤滋恬,失蹤者是張志新(化名)和其女友劉穎聊训,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恢氯,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡魔眨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年媳维,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遏暴。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡侄刽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朋凉,到底是詐尸還是另有隱情州丹,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布杂彭,位于F島的核電站墓毒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏亲怠。R本人自食惡果不足惜所计,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望团秽。 院中可真熱鬧主胧,春花似錦、人聲如沸习勤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽图毕。三九已至夷都,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間予颤,已是汗流浹背囤官。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛤虐,地道東北人治拿。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像笆焰,于是被迫代替她去往敵國和親劫谅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1嚷掠、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_x閱讀 15,968評論 3 119
  • 所謂“決情定宜”捏检,就是要能夠決斷出最有價值、最值得去做的事不皆。你能夠認清自己的能力極限贯城,在第一時間作出有效地判斷,對...
    不會飛的章魚閱讀 655評論 1 0
  • 2018.6.5 星期二 晴 今晚雯爸把一個大西瓜一切兩半霹娄,用勺子挖著先吃起來能犯,我忙完手里的活坐到桌前準備...
    開心靖雯閱讀 187評論 0 0
  • 聽說蛇是會復仇的鲫骗,真的有這回事嗎? 殺死毒蛇 賈家世世代代都住在一片深山老林里踩晶,這里沒人打擾执泰,特別安靜。 賈三每天...
    那年木槿花開閱讀 1,349評論 50 53