微信小程序实现省市区级联选择组件

微信小程序实现省市区级联选择组件

  1. 首先,创建一个新的组件,命名为 area-picker

  2. area-picker.wxml 文件中添加以下代码:

<view class="area-picker">
  <picker mode="multiSelector" bindchange="onPickerChange" bindcolumnchange="onColumnChange" value="{{pickerIndex}}" range="{{pickerData}}">
    <view class="picker-view">
      {{selectedArea || '请选择省市区'}}
    </view>
  </picker>
</view>
  1. area-picker.ts 文件中添加以下代码:
import { areaData } from './area-data';

interface AreaItem {
  code: string;
  name: string;
}

Component({
  properties: {
    // 可以添加自定义属性
  },

  data: {
    pickerData: [[], [], []] as string[][],
    pickerIndex: [0, 0, 0],
    selectedArea: '',
    provinces: [] as AreaItem[],
    cities: [] as AreaItem[],
    districts: [] as AreaItem[],
  },

  lifetimes: {
    attached() {
      this.initAreaData();
    },
  },

  methods: {
    initAreaData() {
      const provinces = areaData.map(province => ({
        code: province.code,
        name: province.name,
      }));

      this.setData({
        provinces,
        pickerData: [
          provinces.map(p => p.name),
          [],
          [],
        ],
      });

      this.updateCities(0);
      this.updateDistricts(0);
    },

    updateCities(provinceIndex: number) {
      const cities = areaData[provinceIndex].children.map(city => ({
        code: city.code,
        name: city.name,
      }));

      this.setData({
        cities,
        'pickerData[1]': cities.map(c => c.name),
      });
    },

    updateDistricts(cityIndex: number) {
      const { pickerIndex } = this.data;
      const districts = areaData[pickerIndex[0]].children[cityIndex].children.map(district => ({
        code: district.code,
        name: district.name,
      }));

      this.setData({
        districts,
        'pickerData[2]': districts.map(d => d.name),
      });
    },

    onColumnChange(e: WechatMiniprogram.PickerColumnChange) {
      const { column, value } = e.detail;
      const { pickerIndex } = this.data;

      pickerIndex[column] = value;

      if (column === 0) {
        this.updateCities(value);
        this.updateDistricts(0);
        pickerIndex[1] = 0;
        pickerIndex[2] = 0;
      } else if (column === 1) {
        this.updateDistricts(value);
        pickerIndex[2] = 0;
      }

      this.setData({ pickerIndex });
    },

    onPickerChange(e: WechatMiniprogram.PickerChange) {
      const { value } = e.detail;
      const { provinces, cities, districts } = this.data;

      const selectedArea = `${provinces[value[0]].name} ${cities[value[1]].name} ${districts[value[2]].name}`;

      this.setData({ selectedArea });
      this.triggerEvent('areachange', {
        province: provinces[value[0]],
        city: cities[value[1]],
        district: districts[value[2]],
      });
    },
  },
});
  1. 创建 area-data.ts 文件,包含省市区数据:
export const areaData = [
  {
    code: '110000',
    name: '北京市',
    children: [
      {
        code: '110100',
        name: '北京市',
        children: [
          { code: '110101', name: '东城区' },
          { code: '110102', name: '西城区' },
          // ... 其他区
        ],
      },
    ],
  },
  // ... 其他省份
];
  1. area-picker.wxss 文件中添加一些基本样式:
.area-picker {
  padding: 10px;
}

.picker-view {
  border: 1px solid #ccc;
  padding: 10px;
  border-radius: 4px;
}
  1. 在页面中使用该组件:
<area-picker bind:areachange="onAreaChange" />

在对应的页面 .ts 文件中添加 onAreaChange 方法:

Page({
  onAreaChange(e: any) {
    const { province, city, district } = e.detail;
    console.log('Selected area:', province, city, district);
  },
});

这个组件实现了以下功能:

  1. 三级联动的省市区选择
  2. 选择后显示完整的地址文本
  3. 选择完成后触发 areachange 事件,返回选中的省市区对象

关注微信公众号温暖前端,不定期分享前端知识点和前端资料↓↓↓

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】 适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】 适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】 适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】 适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】 适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】适合专科和本科毕业生的【原创论文】【已降重】【万字】【本科】【专科】【毕业论文】【预览目录】【预览正文】

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温暖前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值