微信小程序如何实现省市区三级联动地址选择功能?

更新于
2026-09-25 08:06:52
1阅读来源:SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1353个文字,预计阅读时间需要6分钟。

微信小程序如何实现省市区三级联动地址选择功能?

本文实例介绍了如何利用微信原生小程序实现选择地址的三级联动效果。代码简洁,方便参考。具体内容包括:

1. 微信原生地址选择API

2.省市区三级联动实现

3.自定义数据存储与思路

微信原生地址API:

- 获取当前位置:wx.getLocation- 获取经纬度信息:wx.getLocation

省市区三级联动实现:javascriptPage({ data: { province: [], // 省列表 city: [], // 城市列表 district: [], // 区列表 selectedProvince: '', selectedCity: '', selectedDistrict: '' }, onLoad: function () { // 获取省市区数据 this.getAreaData(); }, // 获取省市区数据 getAreaData: function () { // 假设已获取省市区数据,并存储在data对象中 let provinces=this.data.province; let cities=this.data.city; let districts=this.data.district;

// 设置默认选中的省市区 this.setData({ selectedProvince: provinces[0], selectedCity: cities[0], selectedDistrict: districts[0] }); }, // 选择省 bindProvinceChange: function (e) { let provinceIndex=e.detail.value; let selectedProvince=this.data.province[provinceIndex]; this.setData({ selectedProvince: selectedProvince, selectedCity: '', selectedDistrict: '' }); // 根据选中的省获取对应的城市 this.getCityData(selectedProvince); }, // 选择市 bindCityChange: function (e) { let cityIndex=e.detail.value; let selectedCity=this.data.city[cityIndex]; this.setData({ selectedCity: selectedCity, selectedDistrict: '' }); // 根据选中的市获取对应的区 this.getDistrictData(selectedCity); }, // 选择区 bindDistrictChange: function (e) { let districtIndex=e.detail.value; let selectedDistrict=this.data.district[districtIndex]; this.setData({ selectedDistrict: selectedDistrict }); }, // 根据选中的省获取对应的城市 getCityData: function (selectedProvince) { // 获取对应城市的数据 let cities=this.data.city; // 遍历城市数据,筛选出与选中的省对应的市 let selectedCities=cities.filter(function (city) { return city.provinceId===selectedProvince.id; }); // 设置城市列表 this.setData({ city: selectedCities }); }, // 根据选中的市获取对应的区 getDistrictData: function (selectedCity) { // 获取对应区的数据 let districts=this.data.district; // 遍历区数据,筛选出与选中的市对应的区 let selectedDistricts=districts.filter(function (district) { return district.cityId===selectedCity.id; }); // 设置区列表 this.setData({ district: selectedDistricts }); }});

自定义数据存储与思路:- 使用Page对象中的setData方法更新数据- 根据选中的省市区更新对应的数据列表- 在选择某个级别的地址后,获取对应级别的数据,更新数据列表

以上就是实现微信原生小程序地址选择的三级联动效果的简单示例。希望对您有所帮助!

本文实例为大家分享了微信小程序实现选择地址省市区三级联动的具体代码,供大家参考,具体内容如下

微信原生地址API,缺少省市区code,因此自己写了一个收货地址

思路:在onload预先加载全部省和第一个省的全部市和区,加载全部会导致几秒的事件阻塞。点击选择地址弹窗后,按需加载操作,滑动省加载对应的市和第一个市对应的区,滑动市加载区,滑动区只更改区的值

微信小程序如何实现省市区三级联动地址选择功能?

onLoad: function(options) { var that = this; // 此文件为全部省以及第一个省的市和区 var cityData = districtLoad.districtLoad; // 存放省 const provinces = []; // 存放市 const citys = []; // 存放区 const countys = []; for (let i = 0; i < cityData.length; i++) { provinces.push(cityData[i]); } for (let i = 0; i < cityData[0].sub.length; i++) { citys.push(cityData[0].sub[i]) } for (let i = 0; i < cityData[0].sub[0].sub.length; i++) { countys.push(cityData[0].sub[0].sub[i]) } that.setData({ provinces, citys, countys }) }

滑动省市区事件

bindChange: function(e) { var that = this; var val = e.detail.value var t = this.data.values; // 滑动省 if (val[0] != t[0]) { const citys = []; const countys = []; // 保存市 for (let i = 0; i < cityData[val[0]].sub.length; i++) { citys.push(cityData[val[0]].sub[i]) } // 保存第一个市的全部区 for (let i = 0; i < cityData[val[0]].sub[0].sub.length; i++) { countys.push(cityData[val[0]].sub[0].sub[i]) } // 保存 this.setData({ province: cityData[val[0]].name, city: cityData[val[0]].sub[0].name, citys: citys, countys: countys, values: val, value: [val[0], 0, 0], fdeliveryProvince: this.data.provinces[val[0]].code, fdeliveryCity: cityData[val[0]].sub[0].code, }) // 防止只有省市的情况 if (cityData[val[0]].sub[0].sub.length!=0){ that.setData({ county: cityData[val[0]].sub[0].sub[0].name, fdeliveryArea: cityData[val[0]].sub[0].sub[0].code }) }else { that.setData({ county: '', fdeliveryArea:'' }) } return; } // 滑动市 if (val[1] != t[1]) { const countys = []; // 保存市 for (let i = 0; i < cityData[val[0]].sub[val[1]].sub.length; i++) { countys.push(cityData[val[0]].sub[val[1]].sub[i]) } // 保存 this.setData({ city: this.data.citys[val[1]].name, countys: countys, values: val, value: [val[0], val[1], 0], fdeliveryCity: this.data.citys[val[1]].code, }) // 防止只有省市的情况 if (countys.length != 0) { that.setData({ county: cityData[val[0]].sub[val[1]].sub[0].name, fdeliveryArea: cityData[val[0]].sub[val[1]].sub[0].code }) } else { that.setData({ county: '', fdeliveryArea: '' }) } return; } // 滑动区 if (val[2] != t[2]) { this.setData({ county: this.data.countys[val[2]].name, values: val, fdeliveryArea: this.data.countys[val[2]].code }) return; } }

html

<view class="citypicker" wx:if="{{condition}}"> <view class="cityheader"> <view bindtap="open" class="city-cancel">取消</view> <view bindtap="open" class="city-true">确定</view> </view> <picker-view indicator-style="height: 40px;" style="font-size:30rpx; width: 100%; height: 290px;" value="{{value}}" bindchange="bindChange" class="citybody"> <picker-view-column> <view wx:for="{{provinces}}" wx:key="{{item.name}}" wx:code="{{item.code}}" style="line-height: 40px;padding-left:10px;">{{item.name}}</view> </picker-view-column> <picker-view-column> <view wx:for="{{citys}}" wx:key="{{item.name}}" wx:code="{{item.code}}" style="line-height: 40px;padding-left:10px;">{{item.name}}</view> </picker-view-column> <picker-view-column> <view wx:for="{{countys}}" wx:key="{{item.name}}" wx:code="{{item.code}}" style="line-height: 40px;padding-left:10px;">{{item.name}}</view> </picker-view-column> </picker-view> </view>

效果图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

本文共计1353个文字,预计阅读时间需要6分钟。

微信小程序如何实现省市区三级联动地址选择功能?

本文实例介绍了如何利用微信原生小程序实现选择地址的三级联动效果。代码简洁,方便参考。具体内容包括:

1. 微信原生地址选择API

2.省市区三级联动实现

3.自定义数据存储与思路

微信原生地址API:

- 获取当前位置:wx.getLocation- 获取经纬度信息:wx.getLocation

省市区三级联动实现:javascriptPage({ data: { province: [], // 省列表 city: [], // 城市列表 district: [], // 区列表 selectedProvince: '', selectedCity: '', selectedDistrict: '' }, onLoad: function () { // 获取省市区数据 this.getAreaData(); }, // 获取省市区数据 getAreaData: function () { // 假设已获取省市区数据,并存储在data对象中 let provinces=this.data.province; let cities=this.data.city; let districts=this.data.district;

// 设置默认选中的省市区 this.setData({ selectedProvince: provinces[0], selectedCity: cities[0], selectedDistrict: districts[0] }); }, // 选择省 bindProvinceChange: function (e) { let provinceIndex=e.detail.value; let selectedProvince=this.data.province[provinceIndex]; this.setData({ selectedProvince: selectedProvince, selectedCity: '', selectedDistrict: '' }); // 根据选中的省获取对应的城市 this.getCityData(selectedProvince); }, // 选择市 bindCityChange: function (e) { let cityIndex=e.detail.value; let selectedCity=this.data.city[cityIndex]; this.setData({ selectedCity: selectedCity, selectedDistrict: '' }); // 根据选中的市获取对应的区 this.getDistrictData(selectedCity); }, // 选择区 bindDistrictChange: function (e) { let districtIndex=e.detail.value; let selectedDistrict=this.data.district[districtIndex]; this.setData({ selectedDistrict: selectedDistrict }); }, // 根据选中的省获取对应的城市 getCityData: function (selectedProvince) { // 获取对应城市的数据 let cities=this.data.city; // 遍历城市数据,筛选出与选中的省对应的市 let selectedCities=cities.filter(function (city) { return city.provinceId===selectedProvince.id; }); // 设置城市列表 this.setData({ city: selectedCities }); }, // 根据选中的市获取对应的区 getDistrictData: function (selectedCity) { // 获取对应区的数据 let districts=this.data.district; // 遍历区数据,筛选出与选中的市对应的区 let selectedDistricts=districts.filter(function (district) { return district.cityId===selectedCity.id; }); // 设置区列表 this.setData({ district: selectedDistricts }); }});

自定义数据存储与思路:- 使用Page对象中的setData方法更新数据- 根据选中的省市区更新对应的数据列表- 在选择某个级别的地址后,获取对应级别的数据,更新数据列表

以上就是实现微信原生小程序地址选择的三级联动效果的简单示例。希望对您有所帮助!

本文实例为大家分享了微信小程序实现选择地址省市区三级联动的具体代码,供大家参考,具体内容如下

微信原生地址API,缺少省市区code,因此自己写了一个收货地址

思路:在onload预先加载全部省和第一个省的全部市和区,加载全部会导致几秒的事件阻塞。点击选择地址弹窗后,按需加载操作,滑动省加载对应的市和第一个市对应的区,滑动市加载区,滑动区只更改区的值

微信小程序如何实现省市区三级联动地址选择功能?

onLoad: function(options) { var that = this; // 此文件为全部省以及第一个省的市和区 var cityData = districtLoad.districtLoad; // 存放省 const provinces = []; // 存放市 const citys = []; // 存放区 const countys = []; for (let i = 0; i < cityData.length; i++) { provinces.push(cityData[i]); } for (let i = 0; i < cityData[0].sub.length; i++) { citys.push(cityData[0].sub[i]) } for (let i = 0; i < cityData[0].sub[0].sub.length; i++) { countys.push(cityData[0].sub[0].sub[i]) } that.setData({ provinces, citys, countys }) }

滑动省市区事件

bindChange: function(e) { var that = this; var val = e.detail.value var t = this.data.values; // 滑动省 if (val[0] != t[0]) { const citys = []; const countys = []; // 保存市 for (let i = 0; i < cityData[val[0]].sub.length; i++) { citys.push(cityData[val[0]].sub[i]) } // 保存第一个市的全部区 for (let i = 0; i < cityData[val[0]].sub[0].sub.length; i++) { countys.push(cityData[val[0]].sub[0].sub[i]) } // 保存 this.setData({ province: cityData[val[0]].name, city: cityData[val[0]].sub[0].name, citys: citys, countys: countys, values: val, value: [val[0], 0, 0], fdeliveryProvince: this.data.provinces[val[0]].code, fdeliveryCity: cityData[val[0]].sub[0].code, }) // 防止只有省市的情况 if (cityData[val[0]].sub[0].sub.length!=0){ that.setData({ county: cityData[val[0]].sub[0].sub[0].name, fdeliveryArea: cityData[val[0]].sub[0].sub[0].code }) }else { that.setData({ county: '', fdeliveryArea:'' }) } return; } // 滑动市 if (val[1] != t[1]) { const countys = []; // 保存市 for (let i = 0; i < cityData[val[0]].sub[val[1]].sub.length; i++) { countys.push(cityData[val[0]].sub[val[1]].sub[i]) } // 保存 this.setData({ city: this.data.citys[val[1]].name, countys: countys, values: val, value: [val[0], val[1], 0], fdeliveryCity: this.data.citys[val[1]].code, }) // 防止只有省市的情况 if (countys.length != 0) { that.setData({ county: cityData[val[0]].sub[val[1]].sub[0].name, fdeliveryArea: cityData[val[0]].sub[val[1]].sub[0].code }) } else { that.setData({ county: '', fdeliveryArea: '' }) } return; } // 滑动区 if (val[2] != t[2]) { this.setData({ county: this.data.countys[val[2]].name, values: val, fdeliveryArea: this.data.countys[val[2]].code }) return; } }

html

<view class="citypicker" wx:if="{{condition}}"> <view class="cityheader"> <view bindtap="open" class="city-cancel">取消</view> <view bindtap="open" class="city-true">确定</view> </view> <picker-view indicator-style="height: 40px;" style="font-size:30rpx; width: 100%; height: 290px;" value="{{value}}" bindchange="bindChange" class="citybody"> <picker-view-column> <view wx:for="{{provinces}}" wx:key="{{item.name}}" wx:code="{{item.code}}" style="line-height: 40px;padding-left:10px;">{{item.name}}</view> </picker-view-column> <picker-view-column> <view wx:for="{{citys}}" wx:key="{{item.name}}" wx:code="{{item.code}}" style="line-height: 40px;padding-left:10px;">{{item.name}}</view> </picker-view-column> <picker-view-column> <view wx:for="{{countys}}" wx:key="{{item.name}}" wx:code="{{item.code}}" style="line-height: 40px;padding-left:10px;">{{item.name}}</view> </picker-view-column> </picker-view> </view>

效果图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。