当前位置:  首页>> 技术小册>> 微信小程序全栈开发实战(上)

17 | 滚动选择器(二):使用两种方式自定义实现省、市、区三级联动的选择器

在微信小程序开发中,实现省、市、区三级联动的选择器是一个常见且实用的功能,尤其在涉及地址选择、物流配送等场景时尤为重要。本章将深入探讨两种主流方式来自定义实现这一功能:一种是通过微信小程序内置的picker-view组件结合数据绑定与事件处理实现;另一种则是利用scroll-view组件结合自定义逻辑和动画效果,打造更加灵活和个性化的选择器。

一、使用picker-view组件实现

picker-view是微信小程序提供的一个强大的选择器组件,它支持多列选择,非常适合用于实现三级联动选择器。下面将详细介绍如何使用picker-view来实现省、市、区三级联动。

1. 数据准备

首先,需要准备省、市、区的数据。这些数据通常以JSON格式存储,每个级别的数据都包含下一级的引用(如通过ID和名称的映射关系)。

  1. // 示例数据(简化版)
  2. "provinces": [
  3. {"id": 1, "name": "广东省", "cities": [...]},
  4. {"id": 2, "name": "浙江省", "cities": [...]}
  5. ],
  6. "cities": [
  7. {"id": 101, "provinceId": 1, "name": "广州市", "districts": [...]},
  8. {"id": 102, "provinceId": 1, "name": "深圳市", "districts": [...]}
  9. ],
  10. "districts": [
  11. {"id": 1001, "cityId": 101, "name": "天河区"},
  12. {"id": 1002, "cityId": 101, "name": "越秀区"}
  13. ]
2. 页面结构(WXML)

使用picker-viewpicker-view-column组件构建选择器界面。

  1. <view class="picker-container">
  2. <picker-view indicator-style="height: 50px;" style="width: 100%; height: 300px;" value="{{value}}" range="{{range}}" bindchange="bindPickerChange">
  3. <picker-view-column>
  4. <view wx:for="{{provinces}}" wx:key="id" style="line-height: 50px;">{{item.name}}</view>
  5. </picker-view-column>
  6. <picker-view-column>
  7. <!-- 根据选择的省份动态加载城市 -->
  8. <view wx:for="{{currentCities}}" wx:key="id" style="line-height: 50px;">{{item.name}}</view>
  9. </picker-view-column>
  10. <picker-view-column>
  11. <!-- 根据选择的城市动态加载区 -->
  12. <view wx:for="{{currentDistricts}}" wx:key="id" style="line-height: 50px;">{{item.name}}</view>
  13. </picker-view-column>
  14. </picker-view>
  15. </view>

注意:这里的currentCitiescurrentDistricts是页面数据的一部分,需要根据用户的选择动态更新。

3. 逻辑处理(JS)
  • 在Page的data中定义初始值和监听函数。
  • bindPickerChange函数中处理用户的选择,更新currentCitiescurrentDistricts
  1. Page({
  2. data: {
  3. value: [0, 0, 0], // 初始选择值,对应省、市、区的索引
  4. provinces: [],
  5. cities: [],
  6. districts: [],
  7. currentCities: [],
  8. currentDistricts: []
  9. },
  10. onLoad: function() {
  11. // 假设这里通过API或其他方式加载了省市区数据
  12. this.setData({
  13. provinces: // 加载的省份数据
  14. });
  15. this.updateCities(0); // 初始加载第一个省份的城市
  16. },
  17. bindPickerChange: function(e) {
  18. const { range } = e.detail;
  19. this.setData({
  20. value: range
  21. });
  22. const provinceIndex = range[0];
  23. this.updateCities(provinceIndex);
  24. this.updateDistricts(range[1]);
  25. },
  26. updateCities: function(provinceIndex) {
  27. // 根据省份索引更新城市数据
  28. },
  29. updateDistricts: function(cityIndex) {
  30. // 根据城市索引更新区数据
  31. }
  32. });

二、使用scroll-view组件自定义实现

虽然picker-view提供了便捷的解决方案,但在某些场景下,开发者可能希望拥有更多的自定义空间,比如调整滚动条样式、添加动画效果等。这时,可以使用scroll-view组件来手动实现三级联动选择器。

1. 页面结构(WXML)

使用scroll-view构建三个垂直滚动的列表,分别对应省、市、区。

  1. <view class="scroll-picker">
  2. <scroll-view scroll-y="true" style="height: 100px;" bindscroll="handleScrollProvince">
  3. <view wx:for="{{provinces}}" wx:key="id" class="picker-item" style="height: 30px; line-height: 30px;">{{item.name}}</view>
  4. </scroll-view>
  5. <scroll-view scroll-y="true" style="height: 100px;" bindscroll="handleScrollCity">
  6. <view wx:for="{{currentCities}}" wx:key="id" class="picker-item" style="height: 30px; line-height: 30px;">{{item.name}}</view>
  7. </scroll-view>
  8. <scroll-view scroll-y="true" style="height: 100px;" bindscroll="handleScrollDistrict">
  9. <view wx:for="{{currentDistricts}}" wx:key="id" class="picker-item" style="height: 30px; line-height: 30px;">{{item.name}}</view>
  10. </scroll-view>
  11. </view>
2. 逻辑处理(JS)
  • 监听每个scroll-view的滚动事件,根据滚动位置计算当前选中的项。
  • 更新currentCitiescurrentDistricts以反映当前的选择。
  1. Page({
  2. data: {
  3. // ... 数据定义同上
  4. provinceScrollTop: 0, // 省份滚动条位置
  5. cityScrollTop: 0, // 城市滚动条位置
  6. districtScrollTop: 0 // 区滚动条位置
  7. },
  8. handleScrollProvince: function(e) {
  9. this.setData({
  10. provinceScrollTop: e.detail.scrollTop
  11. });
  12. // 根据scrollTop计算当前选择的省份索引,并更新城市和区的数据
  13. },
  14. handleScrollCity: function(e) {
  15. // 类似处理城市选择
  16. },
  17. handleScrollDistrict: function(e) {
  18. // 类似处理区选择
  19. }
  20. });

注意:由于scroll-view不直接提供当前选中项的索引,因此需要通过计算滚动条的位置与每个选项的高度来确定当前选中的项。这通常涉及到一些数学计算和可能的性能优化。

总结

通过picker-view组件和scroll-view组件,我们分别展示了两种实现微信小程序中省、市、区三级联动选择器的方法。picker-view提供了更简洁的API和较好的用户体验,适合大多数情况;而scroll-view则提供了更高的自定义空间,适合需要特殊效果或布局的场景。开发者可以根据实际需求选择合适的方法。


该分类下的相关小册推荐: