亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

小程序實現多列選擇器

2019-11-19 12:08:30
字體:
來源:轉載
供稿:網友

本文實例為大家分享了小程序實現多列選擇器的具體代碼,供大家參考,具體內容如下

代碼分兩部分,先上wxml

<view class="container"> <form catchsubmit="formSubmit">  <view class="form-card">   <view class="weui-cell weui-cell_input">    <view class="weui-cell__hd">     <view class="weui-label">物種<span>*</span></view>    </view>    <view class="weui-cell__bd">     <picker mode="multiSelector" bindchange="bindMultiPickerChange" bindcolumnchange="bindMultiPickerColumnChange" value="{{multiIndex}}" range="{{multiArray}}">      <view class="weui-input">{{multiArray[0][multiIndex[0]]}}{{multiArray[1][multiIndex[1]]}}{{multiArray[2][multiIndex[2]]}}</view>     </picker>    </view>   </view>  </view> </form>  </view>

其次是js

Page({  /**  * 頁面的初始數據  */ data: {  objectMultiShow: [],  objectMultiArray: [],  multiArray: [],  multiIndex: [],  checkeIndex: [] },  /**  * 生命周期函數--監聽頁面加載  * objectMultiShow--匹配多列選擇器渲染數據所對應的json數據(包含id,parentId,name)  * multiArray--多列選擇器渲染數據  */ onLoad: function (options) {  // 初始化  let data = {   objectMultiShow: this.data.objectMultiShow,   objectMultiArray: this.data.objectMultiArray,   multiArray: this.data.multiArray,   multiIndex: this.data.multiIndex,   checkeIndex: this.data.checkeIndex  }  data.objectMultiArray = [   [{ id: 0, name: '無脊柱動物' }, { id: 1, name: '脊柱動物' }],   [    { id: 0, name: '扁性動物', parentId: 0 }, { id: 1, name: '線形動物', parentId: 0 }, { id: 2, name: '環節動物', parentId: 0 }, { id: 3, name: '軟體動物', parentId: 0 }, { id: 4, name: '節肢動物', parentId: 0 },    { id: 5, name: '魚', parentId: 1 }, { id: 6, name: '兩棲動物', parentId: 1 }, { id: 7, name: '爬行動物', parentId: 1 }   ],   [    { id: 0, name: '豬肉絳蟲', parentId: 0 }, { id: 1, name: '吸血蟲', parentId: 0 },    { id: 2, name: '蛔蟲', parentId: 1 },    { id: 3, name: '螞蟻', parentId: 2 }, { id: 4, name: '螞蟥', parentId: 2 },    { id: 5, name: '河蚌', parentId: 3 }, { id: 6, name: '蝸牛', parentId: 3 }, { id: 7, name: '蛞蝓', parentId: 3 },    { id: 8, name: '昆蟲', parentId: 4 }, { id: 9, name: '甲殼動物', parentId: 4 }, { id: 10, name: '蛛形動物', parentId: 4 }, { id: 11, name: '多足動物', parentId: 4 },    { id: 3, name: '鯽魚', parentId: 5 }, { id: 4, name: '帶魚', parentId: 5 },    { id: 3, name: '青蛙', parentId: 6 }, { id: 4, name: '娃娃魚', parentId: 6 },    { id: 3, name: '蜥蜴', parentId: 7 }, { id: 4, name: '龜', parentId: 7 }, { id: 4, name: '壁虎', parentId: 7 },   ]  ]  data.objectMultiShow = data.objectMultiArray.map((item, index) => {   if (index > 0) {    item = item.filter(i => i.parentId === data.objectMultiArray[index - 1][0].id)   }   return item  })  data.multiArray = data.objectMultiShow.map(item => {   item = item.map(i => i.name)   return item  })  console.log(data.multiIndex)  // 數據更新  this.setData(data) },  bindMultiPickerChange: function (e) {  console.log('picker發送選擇改變,攜帶值為', e.detail.value)  this.setData({   multiIndex: e.detail.value  }) }, bindMultiPickerColumnChange: function (e) {  console.log('修改的列為', e.detail.column, ',值為', e.detail.value);  // 初始化數據  var data = {   objectMultiShow: this.data.objectMultiShow,   multiArray: this.data.multiArray,   multiIndex: this.data.multiIndex  };   // 改變第i列數據之后,后幾列選擇第0個選項(重置)  data.multiIndex[e.detail.column] = e.detail.value;  for (let i = e.detail.column; i < data.multiIndex.length - 1; i++) {   data.multiIndex[i + 1] = 0  }   /**   * 改變第i列數據之后,后幾列數據更新   * 兩種寫法:for 和 switch,switch為三列選擇器寫法,for由switch精簡拓展過來,可用于多列選擇器   * swich寫法:如果更改的是第一列數據,第二列數據通過filter篩選(parentId = 第一列選中項id),同時更新第三列數據   *      如果更改的是第二列數據,更新第三列數據 通過filter篩選(parentId = 第二列選中項id)   */  let arry = this.data.objectMultiArray  for (let i = e.detail.column; i < data.multiIndex.length - 1; i++) {   data.objectMultiShow[i + 1] = arry[i + 1].filter(item => item.parentId === data.objectMultiShow[i][data.multiIndex[i]].id)   data.multiArray[i + 1] = data.objectMultiShow[i + 1].map(item => item.name)  }  /*switch (e.detail.column) {   case 0:    data.objectMultiShow[1] = arry[1].filter(item => item.parentId === data.objectMultiShow[0][data.multiIndex[0]].id)    data.multiArray[1] = data.objectMultiShow[1].map(item => item.name)    data.objectMultiShow[2] = arry[2].filter(item => item.parentId === data.objectMultiShow[1][data.multiIndex[1]].id)    data.multiArray[2] = data.objectMultiShow[2].map(item => item.name)    break;   case 1:    data.objectMultiShow[2] = arry[2].filter(item => item.parentId === data.objectMultiShow[1][data.multiIndex[1]].id)    data.multiArray[2] = data.objectMultiShow[2].map(item => item.name)  }*/  // 數據更新  this.setData(data); }})

wxml部分選用的官方組件--picker,根據官方文檔mode=multiSelector,表示使用多列選擇器。

其他參數容我吐槽下:首先是range--綁定的二維數據,只能是字符串組成的二維數組,比如[["a","b"], ["c","d"]],這樣的話多列選擇器就是第一列a,b選項,第二列c,d選項。感覺很美。然而事實上這能干啥捏?我們做的多列選擇器并不是只是頁面展示,要跟后臺對接數據的,就這樣傳字符串合適否?我需要的是帶id之類的對象,而wxml頁面又不支持雙括號綁定數據里寫map之類的函數方法。所以,我們后臺傳過來的數據要改造一下,提取其中的name為綁定數據。

第二個就是value,本來以為這個是對應項中的第幾個是這樣的:a如果對應c,b如果對應d。選擇bd應該就是[1, 1],而事實上是[1, 0]。也就是對應頁面上展示的第幾個對應(bd,頁面上第一列有ab兩個選項,第二列有且只有一個d)

其他關于bindchange綁定的方法是點擊確認按鈕觸發,bindcolumnchange綁定的方法是滑動多列選擇器時候觸發,至于bindcancel綁定感覺就是笑話,數據實時改變,取消需要再綁定一個中間值才能達到該有的效果,這里暫時沒有做。

js部分我使用了五個數據

  • objectMultiShow: []   選中帶id的Object對象數組
  • objectMultiArray: []    后臺帶id,parentId對象數組
  • multiArray: []    微信小程序組件需求的字符串二維數組
  • multiIndex: []    微信小程序組件需求的選中對象數組
  • checkeIndex: []    基于bindcancel的中間值(暫時未做)

為了達到我想到的真正的多列效果,我不惜出賣肉體,跟后臺大哥達成的各種屈辱協議,獲得了想要的數據格式第一列數組不帶parentId,因為沒有parent。第二列parentId對應第一列id,第三列parentId對應第二列id,如果還有多,可以依次類推。然后根據需求,依次從中獲取所需的其他數據,完成數據初始化。

然后在滑動多列選擇器的時候,動態更新后一列的數據,我這里做的處理是更新后一列數據,并默認選擇第一個選項。

詳細注釋寫完,發現更多的是配置代碼,具體的功能代碼反而很少。

個人感覺,小程序不是寫代碼,而是在配置選項搭建出來的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品入口福利| 性色av香蕉一区二区| 国产精品久久久久久超碰| 色综合久久久久久中文网| 国产成人在线视频| 国产精品视频网| 国产一区欧美二区三区| 日本国产精品视频| 国产亚洲欧美日韩精品| 国产亚洲欧洲黄色| 91久热免费在线视频| 国产色婷婷国产综合在线理论片a| 中文字幕亚洲一区二区三区五十路| 亚洲美女在线视频| 最近2019中文字幕一页二页| 久久久久一本一区二区青青蜜月| 亚洲免费伊人电影在线观看av| 国产一区二区三区高清在线观看| 国产成人在线亚洲欧美| 国产精品视频最多的网站| 91香蕉嫩草神马影院在线观看| 精品久久久久久久久久久久久| 亚洲精品国产福利| 国产精品美女主播在线观看纯欲| 黑人巨大精品欧美一区二区一视频| 欧美久久精品午夜青青大伊人| 久久精品精品电影网| 欧美与黑人午夜性猛交久久久| 国产精品视频永久免费播放| 在线激情影院一区| 中文字幕日韩综合av| 日韩在线中文字幕| 日本成人黄色片| 国产精品久久久久久久一区探花| 国内精品久久久久久中文字幕| 亚洲已满18点击进入在线看片| 日韩中文字幕国产| 亚洲欧美在线免费| 色婷婷av一区二区三区在线观看| 91久久精品国产91性色| 最近更新的2019中文字幕| 久久91亚洲精品中文字幕奶水| 国产精品ⅴa在线观看h| 亚洲另类欧美自拍| 日本一区二区三区在线播放| 亚洲视频国产视频| 色噜噜狠狠色综合网图区| 欧美亚洲伦理www| 日韩免费不卡av| 色综合色综合久久综合频道88| 91精品在线一区| 国产一区二区丝袜高跟鞋图片| 国产91精品青草社区| 欧美激情国产日韩精品一区18| 亚洲美女性生活视频| 精品国产拍在线观看| 精品久久久久久久久久ntr影视| 日韩在线www| 亚洲第一中文字幕在线观看| 在线视频欧美日韩| 美女精品视频一区| 欧美最顶级丰满的aⅴ艳星| 97在线免费观看视频| 欧美电影免费观看大全| 色琪琪综合男人的天堂aⅴ视频| 日韩欧美亚洲范冰冰与中字| 俺去了亚洲欧美日韩| 久久成人人人人精品欧| 久久久久久有精品国产| 亚洲国产小视频| 欧美高清自拍一区| 欧美在线一区二区三区四| 久久精品亚洲一区| 久久福利视频导航| 亚洲无限av看| 亚洲剧情一区二区| 亚洲成人av资源网| 国产精品久久久久aaaa九色| 国产精品观看在线亚洲人成网| 91免费观看网站| 亚洲女人天堂成人av在线| 日韩电影免费在线观看| 91日韩在线视频| 91精品中文在线| 777国产偷窥盗摄精品视频| 日韩电视剧在线观看免费网站| 欧美福利小视频| 国产精品久久不能| 国产玖玖精品视频| 国产啪精品视频网站| 中文字幕免费精品一区高清| 97热在线精品视频在线观看| 亚洲a级在线播放观看| 久久成人综合视频| 91产国在线观看动作片喷水| 国产精品福利片| 欧美日韩亚洲精品内裤| 国产日韩精品一区二区| 日韩av片免费在线观看| 日韩中文字幕欧美| 欧美日本啪啪无遮挡网站| 国产成人在线视频| 国产精品视频久久| 日韩精品www| 国产精品7m视频| 精品人伦一区二区三区蜜桃网站| 亚洲第一视频在线观看| 亚洲欧美中文字幕| 九色精品免费永久在线| 久久99国产精品久久久久久久久| 欧美一级在线亚洲天堂| 国产亚洲欧洲在线| 国产色婷婷国产综合在线理论片a| 国产精品午夜国产小视频| www.xxxx精品| 91午夜在线播放| 国产精品自产拍在线观| 日韩精品极品视频免费观看| 久久夜色撩人精品| 欧美最猛性xxxxx亚洲精品| 久久久国产精品亚洲一区| 成人伊人精品色xxxx视频| 午夜精品久久久久久久白皮肤| 免费91麻豆精品国产自产在线观看| 欧美激情中文字幕乱码免费| 欧美性猛交xxxx乱大交极品| 久99久在线视频| 亚洲三级av在线| 久久国产精品影片| 亚洲精品久久在线| 国产999在线| 久久99热这里只有精品国产| 国产精品69久久| 久久久久久尹人网香蕉| 亚洲国产天堂久久综合| 国产日韩在线一区| 久久五月天色综合| 亚洲欧美精品一区| 欧美亚洲第一区| 96国产粉嫩美女| 97avcom| 性色av一区二区三区在线观看| 久久综合88中文色鬼| 少妇久久久久久| 亚洲综合精品伊人久久| 91免费看片在线| 欧美日韩国产精品一区二区三区四区| 57pao国产成人免费| 成人午夜高潮视频| 国产伦精品一区二区三区精品视频| 国产精品国产三级国产专播精品人| 久久精品国产亚洲精品2020| 国产成人高清激情视频在线观看| 97久久久免费福利网址| 亚洲国产日韩欧美在线99| 国产日韩精品在线播放| 91精品国产成人www| 欧美日韩国产va另类| 俺去亚洲欧洲欧美日韩| 日韩在线视频网站| 欧美性高潮床叫视频| 日韩欧美有码在线| 久久资源免费视频| 中文字幕亚洲欧美日韩高清|