小程序picker二級(jí)聯(lián)動(dòng)封裝

這幾天做小程序因?yàn)轫?xiàng)目里要做個(gè)行業(yè)分類的二級(jí)聯(lián)動(dòng)灭必,想到了小程序自帶的picker插件告抄,對(duì)照實(shí)例看了一下發(fā)現(xiàn)再姑,小程序picker實(shí)例的數(shù)據(jù)來源格式跟我的項(xiàng)目接口返回的數(shù)據(jù)格式不太一樣丈氓,而且是三級(jí)聯(lián)動(dòng)谬运,所以我準(zhǔn)備把這個(gè)實(shí)例結(jié)構(gòu)改一下扰付,封裝起來,讓大家直接可以拿過來用。

看一下成果展示和我的數(shù)據(jù)格式晚凿,如果數(shù)據(jù)格式和你們正在做的項(xiàng)目一樣,那么就可以直接復(fù)制源代碼使用了塘辅,如果不一樣晃虫,看一下和小程序官方實(shí)例這個(gè)數(shù)據(jù)格式是不是一樣。


成果展示.gif

ff.png

我的項(xiàng)目接口返回的數(shù)據(jù)格式是每一項(xiàng)都有一個(gè)子項(xiàng)(childern)字段扣墩;

1.好了哲银,接下來第一步扛吞,我們把小程序picker官方實(shí)例導(dǎo)入進(jìn)來,刪除沒用的單選和時(shí)間地址的picker(wxml和js里無關(guān)代碼都刪除)荆责,留下一個(gè) 多選擇器功能的代碼滥比。
2.修改wxml,因?yàn)槭嵌?jí)聯(lián)動(dòng)做院,所以要把實(shí)例中的第三級(jí){{multiArray[2][multiIndex[2]]}}給刪除盲泛。

 <picker class="pickerSconed" mode="multiSelector"bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}">
      <view class="picker">
        {{multiArray[0][multiIndex[0]]}},{{multiArray[1][multiIndex[1]]}}
      </view>
</picker>

最后wxml文件中完整的代碼應(yīng)該是這樣键耕。

3.修改js文件寺滚,刪除后的js文件是下面這樣。

Page({
  data: {
     multiArray: [],
     multiIndex: [0, 0],
 }
  bindMultiPickerChange: function (e) {
  },
  bindMultiPickerColumnChange: function (e) {
  }
})

剩下就是我們隨心所欲的往里面寫自己的內(nèi)容了屈雄,因?yàn)槭且庋b組件使用村视,所以要先使用attached(){}這個(gè)方法,讓組件調(diào)用時(shí)候就執(zhí)行代碼酒奶。

attached(){
    this.getIndustry();
  },
  /**
   * 組件的方法列表
   */
  methods: {
    // 獲取行業(yè)分類checkCorp.industry
    getIndustry() {
      let that = this;
      httpPost(xxxx接口地址xxxx, {}, res => {
        if (res.code == httpCode.success) {
          console.log(res.data);
          let temporary = {          //--------------因?yàn)榻涌跀?shù)據(jù)返回的是從第一項(xiàng)開始的蚁孔,這里加一個(gè)請(qǐng)選擇選項(xiàng)放入數(shù)據(jù)的開頭
            label:"請(qǐng)選擇",
            value:"0",
            children:[{label:'',value:'0'}]
          }
          let firstList = res.data; //---------------------將一級(jí)分類數(shù)組放入新的變量里便于操作
          firstList.unshift(temporary);
          console.log(firstList);
          let industryName = firstList.map(m => {
            return m.label            //------------------------獲取一級(jí)下拉列表的名稱
          });
          that.setData({
            multiArray: [industryName, []],      //----------- 將一級(jí)列表的名稱存入二維數(shù)組的第一項(xiàng)
            firstList,                    // ------------一級(jí)的完整數(shù)據(jù) 先存著后面有用
            industryName                //---------------一級(jí)的名稱 先存著后面有用
          });
          let industryOneId = firstList[0]['value'];  //  一級(jí)菜單默認(rèn)的value
          if (industryOneId) {
            that.searchClassInfo(industryOneId);  //如果存在,去掉取相應(yīng)數(shù)組下的list
          }

        }
      })
    },

上面是第一部分代碼惋嚎,我盡量都采用這種代碼附注釋的方式逐行講解杠氢。httpPost是我封裝的一個(gè)post請(qǐng)求,最下面會(huì)貼出來另伍。

下面代碼接this.searchClassInfo()這個(gè)方法鼻百,把一級(jí)的value拿到,其實(shí)這個(gè)value就是id质况。searchClassInfo()方法的主要步驟就是:

  1. 將一級(jí)下拉選中的value取下來

2.根據(jù)存下來的value去firstList里找到相同value的那一項(xiàng)

3.將相同項(xiàng)下的children字段存下來愕宋,并且遍歷出其下的label字段 放入二維數(shù)組的第二位中。

searchClassInfo(value) {
      let that = this;
      if (value) {
        that.setData({
          industryOneId: value   //這個(gè)是一級(jí)列表中用戶選中的value
        });
        that.data.firstList.map(m => {  //firstList是一級(jí)分類的數(shù)組结榄,上方代碼里有
          if (m.value == value) {  //通過比對(duì)查出value對(duì)應(yīng)的這一列
            that.setData({
              secondList: m.children   //用戶選中的一級(jí)分類中的children就是第二列的列表
            })
          }
        });
        // console.log(that.data.secondList);
        let industryTwoName = that.data.secondList.map(m => {
          return m.label    //再遍歷secondList把所有的label取出來放入industryTwoName 中用于二級(jí)列表的展示
        });
        // console.log(industryTwoName);
        let industryName = that.data.industryName;
        that.setData({
          multiArray: [industryName, industryTwoName],  //這就是一個(gè)完整的二級(jí)聯(lián)動(dòng)展示了
          industryTwoName,
        })
      }
    },

然后我們要他的滾動(dòng)狀態(tài)進(jìn)行監(jiān)聽 ,小程序案例中給了這個(gè)方法:bindcolumnchange="bindMultiPickerColumnChange"中贝,我們直接拿他接著寫

    bindMultiPickerColumnChange: function (e) {
      let that = this;
      console.log('修改的列為', e.detail.column, ',值為', e.detail.value);
      var data = {
        multiArray: that.data.multiArray,
        multiIndex: that.data.multiIndex
      };
      data.multiIndex[e.detail.column] = e.detail.value;  //從這以上的代碼是案例自帶的沒有刪除的臼朗。
/************************************************************/
      let industryOneId_session = that.data.industryOneId;   //  先將滾動(dòng)前的一級(jí)菜單id存下來邻寿,便于之后做對(duì)比
      switch (e.detail.column) {
        case 0:
          let firstList = that.data.firstList;
          var firstId = firstList[e.detail.value]['value'];
          if (industryOneId_session != firstId) { //每次滾動(dòng)的時(shí)候都去和上一個(gè)做一次對(duì)比
            that.searchClassInfo(firstId); // 只要不一樣,就去執(zhí)行上面searchClassInfo()這個(gè)方法
          }
          data.multiIndex[1] = 0;
          break;
      }
  
    }

最后我們需要確定他的改變事件视哑,bindchange="bindMultiPickerChange";

  bindMultiPickerChange: function (e) {
      console.log('picker發(fā)送選擇改變绣否,攜帶值為', e.detail.value);
      var secondList = this.data.secondList;
      var select_key = e.detail.value[1];     //去二維數(shù)組中第二項(xiàng)的下標(biāo)取出來,也就是二級(jí)下拉菜單的下標(biāo)值
      this.setData({
        industryTwoId: secondList[select_key]['value']      //  拿到下標(biāo)值對(duì)應(yīng)的value值就是我們要用的id
      })
    
      this.setData({
        multiIndex: e.detail.value   
      });
      // 通過triggerEvent綁定的myEvent方法挡毅,把一級(jí)下拉的id和二級(jí)下拉的id拿出來
      this.triggerEvent('myEvent', { industryOneId: this.data.industryOneId, industryTwoId: this.data.industryTwoId})
    },

這樣的話蒜撮,組件就封裝好了,別的頁面調(diào)用的話也很簡單


先在json中引入

然后。段磨。

 <industry-class class="pickerSconed" bind:myEvent="getData"></industry-class>

bind:myEvent綁定的getData()方法可以取出組件中傳過來的一級(jí)id和二級(jí)id取逾;

  getData(e){
      let data = e.detail;
      this.setData({
        industryOneId: data.industryOneId,
        industryTwoId: data.industryTwoId
      });
    console.log(this.data.industryOneId);
    console.log(this.data.industryTwoId);
  },
321.png

最后附上封裝的post方法代碼。

// post請(qǐng)求
function httpPost(url, data, cb) {
  wx.request({
    url: 'xxx Ip地址 xxx' + url,
    data: data,
    method: 'POST',
    header: {
     'content-type': 'application/x-www-form-urlencoded',
    },
    success: function (res) {
      return typeof cb == "function" && cb(res.data)
    },
    fail: function () {
      return typeof cb == "function" && cb(false)
    }
  })
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末苹支,一起剝皮案震驚了整個(gè)濱河市砾隅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌债蜜,老刑警劉巖晴埂,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寻定,居然都是意外死亡儒洛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門狼速,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晶丘,“玉大人,你說我怎么就攤上這事唐含。” “怎么了沫浆?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵捷枯,是天一觀的道長。 經(jīng)常有香客問我专执,道長淮捆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任本股,我火速辦了婚禮攀痊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拄显。我一直安慰自己苟径,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布躬审。 她就那樣靜靜地躺著棘街,像睡著了一般。 火紅的嫁衣襯著肌膚如雪承边。 梳的紋絲不亂的頭發(fā)上遭殉,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音博助,去河邊找鬼险污。 笑死,一個(gè)胖子當(dāng)著我的面吹牛富岳,可吹牛的內(nèi)容都是我干的蛔糯。 我是一名探鬼主播拯腮,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渤闷!你這毒婦竟也來了疾瓮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤飒箭,失蹤者是張志新(化名)和其女友劉穎狼电,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弦蹂,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肩碟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凸椿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片削祈。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖脑漫,靈堂內(nèi)的尸體忽然破棺而出髓抑,到底是詐尸還是另有隱情,我是刑警寧澤优幸,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布吨拍,位于F島的核電站,受9級(jí)特大地震影響网杆,放射性物質(zhì)發(fā)生泄漏羹饰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一碳却、第九天 我趴在偏房一處隱蔽的房頂上張望队秩。 院中可真熱鬧,春花似錦昼浦、人聲如沸馍资。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迷帜。三九已至,卻和暖如春色洞,著一層夾襖步出監(jiān)牢的瞬間戏锹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工火诸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锦针,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像奈搜,于是被迫代替她去往敵國和親悉盆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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