首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 初步介绍微信小程序
02 | 还有哪些其它公司的小程序产品
03 | 小程序的特点及开发能力
04 | 新的一年,微信小程序开放了哪些新功能?
05 | 小程序运行机制简介:从零构建一个Web App需要做哪些事情?
06 | 开发环境配置:创建你的第一个小程序项目
07 | icon组件:关于图标的4个实现方案
08 | progress组件:如何自定义实现一个环形进度条?
09 | rich-text组件:如何单击预览rich-text中的图片并保存?
10 | view容器组件及Flex布局(一):学习容器组件view及其重要属性
11 | view容器组件及Flex布局(二):介绍flex布局中常用的样式及样式值
12 | 可移动容器及可移动区域(一):学习使用movable-view与movable-area组件
13 | 可移动容器及可移动区域(二):如何实现侧滑删除功能
14 | scroll-view介绍:在小程序中如何实现滚动锚定?
15 | scroll-view介绍:如果渲染一个滚动的长列表?
16 | 滚动选择器(一):学习使用选择器组件
17 | 滚动选择器(二):使用两种方式自定义实现省、市、区三级联动的选择器
18 | 滑动选择器表单组件:如何基于wxs自定义一个竖向的slider?
19 | 页面链接组件:如何自定义一个导航栏?
20 | image媒体组件(上):如何实现图片的懒加载?
21 | image媒体组件(下):开发中经常遇到的问题?
22 | 如何实现直播间功能?(一):了解live-pusher、live-player组件的主要属性及使用限制
23 | 如何实现直播间功能?(二):如何开启、使用腾讯云的云直播功能
24 | 如何实现直播间功能?(三):安装与使用ffmepg,及使用ffmpeg进行推拉流验证
25 | 如何实现直播间功能?(四):使用live-pusher、live-player组件在小程序中实现直播功能
26 | 如何实现直播间功能?(五):同层渲染
27 | 如何实现直播间功能?(六):live-pusher、live-player组件在开发中的常见问题
28 | web-view(一):了解session、cookie等相关基本概念
29 | web-view(二):了解常见的四种鉴权方式
30 | web-view(三):如何使用koa框架,及如何进行热加载?
31 | web-view(四):如何在服务器端实现cookie与sesson的生成?
32 | web-view(五):如何将session存储到服务器端,及如何实现token验证?
33 | web-view(六):基于koa中间件,实现微信一键登录的后端接口
34 | web-view(七):实现微信用户一键登录
35 | web-view(八):了解正确的微信登录姿势
36 | web-view(九):web-view组件在开发的常见问题讲解
37 | WebGL介绍(一):了解WebGL相关的基础概念
38 | WebGL介绍(二):如何在小程序中取到WebGL上下文环境对象
39 | WebGL介绍(三):了解WebGL的世界坐标系
40 | WebGL介绍(四):重新认识右手坐标系及如何编写顶点着色器代码
41 | WebGL介绍(五):学习片断着色器编写,了解变量修饰变型uniform与attribute
42 | WebGL介绍(六):了解在WebGL中裁剪空间是如何裁剪出来的
43 | WebGL介绍(七):了解着色器变量值的绑定及三种三角形绘制模式之间的差异
44 | WebGL介绍(八):在着色器中使用共享变量,绘制一个颜色渐变的正方形
45 | WebGL介绍(九):完成动画
46 | WebGL介绍(十):绘制一个旋转的立方体
47 | WebGL介绍(十一):在3D绘制中使用纹理材质
48 | WebGL介绍(十二):如何创建相机、场景及光源
49 | WebGL介绍(十三):创建加载器、渲染器与控制器,完成3D模型文件的加载与展示
50 | 网络接口简介(一):如何使用wx.request接口
51 | 网络接口简介(二):将登录代码模块化封装
52 | 网络接口简介(三):Promise介绍及 6 个常用方法
53 | 网络接口简介(四):Promise三个方法any、all与race的使用介绍
54 | 网络接口简介(五):基于Promise+await、async关键字改写登录模块
55 | 网络接口简介(六):关于Page页面隐藏代码执行及Promise对象的catch处理的补充
56 | 网络接口简介(七):学习EventChannel对象
57 | 网络接口简介(八):观察者模式介绍及Event模块实现
58 | 网络接口简介(九):扩展wxp模块的request3方法,实现用户登录的自动融合
59 | tabBar组件(一):系统默认的tabBar组件如何开启及使用
60 | tabBar组件(二):基于系统提供的自定义方式,实现一个tabBar组件
61 | tabBar组件(三):通过自定义组件扩展的方式,给任意组件添加通用方法
62 | 开放接口(一):如何对Page进行全局扩展
63 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 17 | 滚动选择器(二):使用两种方式自定义实现省、市、区三级联动的选择器 在微信小程序开发中,实现省、市、区三级联动的选择器是一个常见且实用的功能,尤其在涉及地址选择、物流配送等场景时尤为重要。本章将深入探讨两种主流方式来自定义实现这一功能:一种是通过微信小程序内置的`picker-view`组件结合数据绑定与事件处理实现;另一种则是利用`scroll-view`组件结合自定义逻辑和动画效果,打造更加灵活和个性化的选择器。 #### 一、使用`picker-view`组件实现 `picker-view`是微信小程序提供的一个强大的选择器组件,它支持多列选择,非常适合用于实现三级联动选择器。下面将详细介绍如何使用`picker-view`来实现省、市、区三级联动。 ##### 1. 数据准备 首先,需要准备省、市、区的数据。这些数据通常以JSON格式存储,每个级别的数据都包含下一级的引用(如通过ID和名称的映射关系)。 ```json // 示例数据(简化版) "provinces": [ {"id": 1, "name": "广东省", "cities": [...]}, {"id": 2, "name": "浙江省", "cities": [...]} ], "cities": [ {"id": 101, "provinceId": 1, "name": "广州市", "districts": [...]}, {"id": 102, "provinceId": 1, "name": "深圳市", "districts": [...]} ], "districts": [ {"id": 1001, "cityId": 101, "name": "天河区"}, {"id": 1002, "cityId": 101, "name": "越秀区"} ] ``` ##### 2. 页面结构(WXML) 使用`picker-view`和`picker-view-column`组件构建选择器界面。 ```xml <view class="picker-container"> <picker-view indicator-style="height: 50px;" style="width: 100%; height: 300px;" value="{{value}}" range="{{range}}" bindchange="bindPickerChange"> <picker-view-column> <view wx:for="{{provinces}}" wx:key="id" style="line-height: 50px;">{{item.name}}</view> </picker-view-column> <picker-view-column> <!-- 根据选择的省份动态加载城市 --> <view wx:for="{{currentCities}}" wx:key="id" style="line-height: 50px;">{{item.name}}</view> </picker-view-column> <picker-view-column> <!-- 根据选择的城市动态加载区 --> <view wx:for="{{currentDistricts}}" wx:key="id" style="line-height: 50px;">{{item.name}}</view> </picker-view-column> </picker-view> </view> ``` 注意:这里的`currentCities`和`currentDistricts`是页面数据的一部分,需要根据用户的选择动态更新。 ##### 3. 逻辑处理(JS) - 在Page的data中定义初始值和监听函数。 - 在`bindPickerChange`函数中处理用户的选择,更新`currentCities`和`currentDistricts`。 ```javascript Page({ data: { value: [0, 0, 0], // 初始选择值,对应省、市、区的索引 provinces: [], cities: [], districts: [], currentCities: [], currentDistricts: [] }, onLoad: function() { // 假设这里通过API或其他方式加载了省市区数据 this.setData({ provinces: // 加载的省份数据 }); this.updateCities(0); // 初始加载第一个省份的城市 }, bindPickerChange: function(e) { const { range } = e.detail; this.setData({ value: range }); const provinceIndex = range[0]; this.updateCities(provinceIndex); this.updateDistricts(range[1]); }, updateCities: function(provinceIndex) { // 根据省份索引更新城市数据 }, updateDistricts: function(cityIndex) { // 根据城市索引更新区数据 } }); ``` #### 二、使用`scroll-view`组件自定义实现 虽然`picker-view`提供了便捷的解决方案,但在某些场景下,开发者可能希望拥有更多的自定义空间,比如调整滚动条样式、添加动画效果等。这时,可以使用`scroll-view`组件来手动实现三级联动选择器。 ##### 1. 页面结构(WXML) 使用`scroll-view`构建三个垂直滚动的列表,分别对应省、市、区。 ```xml <view class="scroll-picker"> <scroll-view scroll-y="true" style="height: 100px;" bindscroll="handleScrollProvince"> <view wx:for="{{provinces}}" wx:key="id" class="picker-item" style="height: 30px; line-height: 30px;">{{item.name}}</view> </scroll-view> <scroll-view scroll-y="true" style="height: 100px;" bindscroll="handleScrollCity"> <view wx:for="{{currentCities}}" wx:key="id" class="picker-item" style="height: 30px; line-height: 30px;">{{item.name}}</view> </scroll-view> <scroll-view scroll-y="true" style="height: 100px;" bindscroll="handleScrollDistrict"> <view wx:for="{{currentDistricts}}" wx:key="id" class="picker-item" style="height: 30px; line-height: 30px;">{{item.name}}</view> </scroll-view> </view> ``` ##### 2. 逻辑处理(JS) - 监听每个`scroll-view`的滚动事件,根据滚动位置计算当前选中的项。 - 更新`currentCities`和`currentDistricts`以反映当前的选择。 ```javascript Page({ data: { // ... 数据定义同上 provinceScrollTop: 0, // 省份滚动条位置 cityScrollTop: 0, // 城市滚动条位置 districtScrollTop: 0 // 区滚动条位置 }, handleScrollProvince: function(e) { this.setData({ provinceScrollTop: e.detail.scrollTop }); // 根据scrollTop计算当前选择的省份索引,并更新城市和区的数据 }, handleScrollCity: function(e) { // 类似处理城市选择 }, handleScrollDistrict: function(e) { // 类似处理区选择 } }); ``` **注意**:由于`scroll-view`不直接提供当前选中项的索引,因此需要通过计算滚动条的位置与每个选项的高度来确定当前选中的项。这通常涉及到一些数学计算和可能的性能优化。 #### 总结 通过`picker-view`组件和`scroll-view`组件,我们分别展示了两种实现微信小程序中省、市、区三级联动选择器的方法。`picker-view`提供了更简洁的API和较好的用户体验,适合大多数情况;而`scroll-view`则提供了更高的自定义空间,适合需要特殊效果或布局的场景。开发者可以根据实际需求选择合适的方法。
上一篇:
16 | 滚动选择器(一):学习使用选择器组件
下一篇:
18 | 滑动选择器表单组件:如何基于wxs自定义一个竖向的slider?
该分类下的相关小册推荐:
微信小程序与云开发(下)
微信小程序全栈开发实战(中)
微信小程序底层框架实现原理
微信小程序全栈开发实战(下)
微信小程序与云开发(上)
微信小程序与云开发(中)