• 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

  • 相关阅读:
    UITextField的总结
    【实战】登录界面
    点分治学习
    2020/3/1
    2020/2/29
    2020/2/28
    2020/2/27
    2020/2/27
    最小树形图
    Ch’s gift HDU6162
  • 原文地址:https://www.cnblogs.com/fozero/p/10483793.html
Copyright © 2020-2023  润新知