mpvue微信小程序多列選擇器用法:實現省份城市選擇


前言

微信小程序默認給我們提供了一個省市區的picker選擇器,只需將mode設置為region即可

<picker
    mode="region"
    bindchange="bindRegionChange"
    value="{{region}}"
    custom-item="{{customItem}}"
  >

因為小程序默認提供的省市區選擇器只能保存名稱,不能保存id,而且我也不需要選擇三級城市,所以這里打算通過mode="multiSelector"來實現省份城市的選擇

城市數據json格式

關於省份城市數據的獲取,這里我通過接口去獲取數據,返回的json格式為

{
    "code": 0,
    "msg": "success",
    "data": [
        {
            "id": 2,
            "name": "北京",
            "children": [
                {
                    "id": 36,
                    "name": "北京市"
                }
            ]
        }
    ]
}

在我們保存提交的時候只需要保存省份和城市的id即可

picker多列選擇器的用法

<picker
          mode="multiSelector"
          @change="bindCityChange"
          @columnchange="bindCityColumnChange"
          :value="multiIndex"
          :range="multiArray"
          range-key="name"
        >
          <view class="picker">選擇城市{{userInfo.province.name}},{{userInfo.city.name}}</view>
        </picker>

設置picker mode屬性為multiSelector

       mode="multiSelector"

1、這里需要注意的是,在mpvue中無法直接使用bindchange和bindcolumnchange,而是使用@change和@columnchange這種方式
2、value是一個數組,例如我們有兩列

[["北京", "湖南"], ["長沙", "永州"]]

3、range也是一個數組,指定的是value值的選中索引值,下標從0開始,如[0,0]
4、如果我們的數據是一個二維對象數組,我們可以通過使用range-key來指定Object 中 key 的值作為選擇器顯示內容

5、當我們確認選中之后會觸發@change事件

// 城市選擇  獲取選中的值 [0,0]  這里需要注意的是獲取值的方式在mpvue中通過e.mp.detail.value而不是e.detail.value
    bindCityChange(e) {
      // 選中的值索引
      console.log(e.mp.detail.value[0], e.mp.detail.value[1]);
      // 選中的省份和城市數據
      console.log(
        this.multiArray[0][e.mp.detail.value[0]],
        this.multiArray[1][e.mp.detail.value[1]]
      );
      this.userInfo.province = this.multiArray[0][e.mp.detail.value[0]];
      this.userInfo.city = this.multiArray[1][e.mp.detail.value[1]];
    },

6、在我們滾動每一列的值的時候會觸發@columnchange事件

7、通過e.mp.detail.column和e.mp.detail.value可以獲取到修改列對應的值

console.log(
        "修改的列為",
        e.mp.detail.column,
        ",值為",
        e.mp.detail.value
      );

通過獲取到修改的數據更新multiIndex的值

// 監聽滾動事件 滾動第一列 修改第二列數據
    bindCityColumnChange(e) {
      // 更新multiIndex的值
      this.multiIndex[e.mp.detail.column] = e.mp.detail.value;
      //加載對應省份下城市數據
      switch (e.mp.detail.column) {
        case 0:
          // this.multiArray[1] = this.cityList[e.mp.detail.value].children;
          this.multiArray = [
            this.cityList,
            this.cityList[e.mp.detail.value].children
          ];
          break;
      }
    },
data() {
    return {
multiIndex: [0, 0],
      multiArray: [],
    }
   }

參考閱讀

https://www.cnblogs.com/Oopa/p/7266976.html
https://developers.weixin.qq.com/miniprogram/dev/component/picker.html


免責聲明!

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



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