uView 2.X 的 picker 组件实现省市区县联动选择功能

uView 2.X 的 picker 组件实现省市区县联动选择功能

<template>
  <view class="container">
    <view class="p-card">
      <view class="p-title">
        <text>收货地址信息</text>
      </view>
      <view class="" style="margin-top: 22rpx;">
        <view
          class="u-flex u-flex-between"
          style="padding: 26rpx 0;border-bottom: 2rpx solid #ECECEC;"
        >
          <view class="">
            <text style="font-size: 30rpx;font-weight: 400;color: #424242;"
              >地区</text
            >
          </view>
          <view
            class="u-flex u-flex-between"
            style="width: 75%;"
            @click="handAddrClick"
          >
            <view class="" style="width: 90%;">
              <u--input
                placeholder="请选择省市区县"
                border="none"
                readonly
                v-model="pcaAddr"
              ></u--input>
              <u-picker
                :show="addrPickerShow"
                ref="uPicker"
                :columns="addrList"
                keyName="text"
                @confirm="confirm"
                @cancel="cancel"
                @change="changeHandler"
              ></u-picker>
            </view>
            <u-icon name="arrow-right" size="15"></u-icon>
          </view>
        </view>
      </view>
    </view>
  </view>
</template>

<script>
  export default {
    data() {
      return {
        pcaAddr: "",
        treeList: [
          {
            text: "北京市",
            value: "110000",
            children: [
              {
                text: "北京市",
                value: "110100",
                children: [
                  {
                    text: "东城区",
                    value: "110101",
                  },
                  {
                    text: "西城区",
                    value: "110102",
                  },
                ],
              },
            ],
          },
          {
            text: "陕西省",
            value: "610000",
            children: [
              {
                text: "西安市",
                value: "610100",
                children: [
                  {
                    text: "新城区",
                    value: "610102",
                  },
                  {
                    text: "碑林区",
                    value: "610103",
                  },
                ],
              },
            ],
          },
        ],
        addrPickerShow: true,
        addrList: [],
      };
    },
    onLoad() {
      this.addrList = [
        this.treeList,
        this.treeList[0].children,
        this.treeList[0].children[0].children,
      ];
    },
    methods: {
      handAddrClick() {
        this.addrPickerShow = true;
      },
      changeHandler(e) {
        const {
          columnIndex,
          value,
          values, // values为当前变化列的数组内容
          index,
          // 微信小程序无法将picker实例传出来,只能通过ref操作
          picker = this.$refs.uPicker,
        } = e;
        // 当第一列值发生变化时,变化第二列(后一列)对应的选项
        if (columnIndex === 0) {
          // picker为选择器this实例,变化第二列对应的选项
          picker.setColumnValues(1, value[0].children);
          // picker为选择器this实例,变化第三列对应的选项
          picker.setColumnValues(2, value[0].children[0].children);
        }

        if (columnIndex === 1) {
          // picker为选择器this实例,变化第三列对应的选项
          picker.setColumnValues(2, value[0].children[index].children);
        }
      },
      // 回调参数为包含columnIndex、value、values
      confirm(e) {
        console.log("confirm", e);
        this.addrPickerShow = false;
      },
      cancel() {
        this.addrPickerShow = false;
      },
    },
  };
</script>

<style scoped>
  .container {
    width: 100vw;
    padding-top: 16rpx;
    min-height: calc(100vh - 16rpx);
    background: #eff0f5;
  }

  .p-card {
    width: 710rpx;
    box-sizing: border-box;
    min-height: 100rpx;
    background: #ffffff;
    border-radius: 16rpx;
    margin: auto;
    padding: 30rpx 24rpx;
  }

  .p-card + .p-card {
    margin-top: 16rpx;
  }

  .p-title {
    font-size: 34rpx;
    font-weight: 500;
    color: #232323;
  }
</style>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uView2.x版本中,Picker组件的使用方式与1.x版本略有不同。下面是一个五级选择器的示例代码: ```html <template> <view class="picker"> <picker :columns="columns" @change="onChange"></picker> </view> </template> <script> export default { data() { return { columns: [ { values: ['份1', '份2', '份3'], defaultIndex: 0, onChange: (value, index) => { // 份变化时更新城列表 const cityValues = this.getCityList(index) this.$set(this.columns, 1, { values: cityValues, defaultIndex: 0 }) // 重置下级选项 this.$set(this.columns, 2, { values: [], defaultIndex: 0 }) this.$set(this.columns, 3, { values: [], defaultIndex: 0 }) this.$set(this.columns, 4, { values: [], defaultIndex: 0 }) } }, { values: [], defaultIndex: 0, onChange: (value, index) => { // 城变化时更新列表 const districtValues = this.getDistrictList(index) this.$set(this.columns, 2, { values: districtValues, defaultIndex: 0 }) // 重置下级选项 this.$set(this.columns, 3, { values: [], defaultIndex: 0 }) this.$set(this.columns, 4, { values: [], defaultIndex: 0 }) } }, { values: [], defaultIndex: 0, onChange: (value, index) => { // 变化时更新街道列表 const streetValues = this.getStreetList(index) this.$set(this.columns, 3, { values: streetValues, defaultIndex: 0 }) // 重置下级选项 this.$set(this.columns, 4, { values: [], defaultIndex: 0 }) } }, { values: [], defaultIndex: 0, onChange: (value, index) => { // 街道变化时更新村庄列表 const villageValues = this.getVillageList(index) this.$set(this.columns, 4, { values: villageValues, defaultIndex: 0 }) } }, { values: [], defaultIndex: 0 } ] } }, methods: { onChange(e) { // 用户选择最后一个选项时输出最终结果 if (e.detail.column === 4) { const province = this.columns[0].values[e.detail.value[0]] const city = this.columns[1].values[e.detail.value[1]] const district = this.columns[2].values[e.detail.value[2]] const street = this.columns[3].values[e.detail.value[3]] const village = this.columns[4].values[e.detail.value[4]] console.log(`${province}-${city}-${district}-${street}-${village}`) } }, getCityList(provinceIndex) { // 根据份获取城列表 // TODO: 根据实际需求替换为异步请求或本地数据 return ['城1', '城2', '城3'] }, getDistrictList(cityIndex) { // 根据城获取列表 // TODO: 根据实际需求替换为异步请求或本地数据 return ['1', '2', '3'] }, getStreetList(districtIndex) { // 根据获取街道列表 // TODO: 根据实际需求替换为异步请求或本地数据 return ['街道1', '街道2', '街道3'] }, getVillageList(streetIndex) { // 根据街道获取村庄列表 // TODO: 根据实际需求替换为异步请求或本地数据 return ['村庄1', '村庄2', '村庄3'] } }, mounted() { // 初始化份列表 const provinceValues = this.columns[0].values this.columns[1].values = this.getCityList(0) // 初始化城列表 const cityValues = this.columns[1].values this.columns[2].values = this.getDistrictList(0) // 初始化列表 const districtValues = this.columns[2].values this.columns[3].values = this.getStreetList(0) // 初始化街道列表 const streetValues = this.columns[3].values this.columns[4].values = this.getVillageList(0) } } </script> <style> .picker { display: flex; flex-direction: row; justify-content: space-between; align-items: center; } </style> ``` 在上面的代码中,我们使用了一个Picker组件,并在其内部嵌套了多个列,对应份、城、街道、村庄五个级别。每当用户选择某个级别的选项时,我们会根据该级别的值更新下一个级别的选项列表。当用户选择最后一个级别时,我们会输出最终的选择结果。 注意,由于uView2.x版本的Picker组件使用的是小程序原生的picker-view组件,因此在更新列的值时需要使用`$set`方法。另外,由于Picker组件的默认值是根据各列的`defaultIndex`属性来确定的,因此在更新列的值时也需要更新默认值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值