当前位置: 首页 > news >正文

小程序-基于vant的Picker组件实现省市区选择

一、原因

因@vant/area-data部分的市/区数据跟后台使用的高德/腾讯省市区有所出入,故须保持跟后台用同一份数据,所以考虑以下几个组件

1、Area
2、Cascader
3、Picker

因为使用的是高德地图的省市区json文件,用area的话修改结构代价太大,费时费力。接着尝试使用Cascader组件,但这个组件每列数据过多时会滑动、点击卡顿等等,故也排除,只剩最后的picker了

Cascader卡顿:

 二、使用

刚开始看文档这个结构一时没有理解,有点懵,后面经过研究发现需要如下结构

高德gaode-area.json为例,点击就可以下载高德省市区数据(包含压缩和未压缩的)

因为想减少小程序的体积,故把文件丢到服务器上了

2.1、页面代码

 <van-field name="area" model:value="{{ area }}" label="地区选择" placeholder="请选择地区" clearable readonly is-link data-popups="showArea" bind:click-input="show_popup" /><!-- 省市区 -->
<van-popup show="{{ showArea }}" position="bottom" round data-popups="showArea" bind:close="hide_popup"><van-picker columns="{{ addrs }}" show-toolbar title="地区选择" value-key="name" bind:change="onAreaChange" data-popups="showArea" bind:confirm="onAreaConfirm" bind:cancel="hide_popup" />
</van-popup>

2.2、js代码

// 主要jsgetAreas() {let that = thiswx.request({url: `${app.globalData.urls}/gaode-area.json`,header: {},success(res) {let result = res.data.districts[0].districtslet arrs = [{values: result}, {values: result[0].districts,defaultIndex: 0,}, {values: result[0].districts[0].districts,defaultIndex: 0,}]that.setData({addrs: arrs})}})},// 省市区变动onAreaChange(e) {const {picker,value,index} = e.detail;if (index === 0) {// 修改省picker.setColumnValues(1, value[0].districts);picker.setColumnValues(2, value[0].districts[0].districts);} else if (index === 1) {// 修改市picker.setColumnValues(2, value[1].districts);}},// 确认选择省市区onAreaConfirm(e) {let value = e.detail.valuelet addr_value = `${value[0].name}${value[1].name}${value[2].name}`;this.setData({province: value[0].name, // 省份city: value[1].name, // 城市district: value[2].name, // 区县province_adcode: value[0].adcode,city_adcode: value[1].adcode,district_adcode: value[2].adcode,area: addr_value,showArea: false,})},

2.3、效果

 

三、 注意事项

在开发者工具上预览和使用会明显感觉到滑动,点击卡顿,但在真机,手机预览的时候不会出现卡顿问题,体验感不错,发布了之后用正式版测目前也没有发现问题

http://www.lryc.cn/news/131853.html

相关文章:

  • 智慧水利利用4G物联网技术实现远程监测、控制、管理
  • sql server Varchar转换为Datetime
  • 什么文件传输协议才能保障跨国文件传输安全又稳定
  • LeetCode笔记:Weekly Contest 359
  • 使用Java和ChatGPT Api来创建自己的大模型聊天机器人
  • Maven介绍_下载_安装_使用_原理
  • 算法通关村十一关 | 位运算的规则
  • 【Rust】Rust学习 第十五章智能指针
  • 炒股怎样加杠杆?关于股票杠杠平台比例的选择知识分析
  • 【jenkins】jenkins流水线构建打包jar,生成docker镜像,重启docker服务的过程,在jenkins上一键完成,实现提交代码自动构建的功能
  • Pytest使用fixture实现token共享
  • You have docker-compose v1 installed, but we require Docker Compose v2.
  • nlopt在windows上的安装使用
  • 【React学习】React中的setState方法
  • ATTCK实战系列——红队实战(一)
  • 服务器感染了.360勒索病毒,如何确保数据文件完整恢复?
  • 【idea】社区版idea运行Tomcat
  • 网络安全面试题整理
  • docker使用code-server搭建开发环境 v2.0
  • Python写一个创意五子棋游戏
  • Nvidia Jetson 编解码开发(1)介绍
  • 【操作系统】24王道考研笔记——第一章 计算机系统概述
  • 菜鸟Vue教程 - 实现带国际化的注册登陆页面
  • Mybatis ORDER BY 排序失效 ORDER BY 与 CASE WHEN THEN 排序问题
  • 日常BUG——微信小程序提交代码报错
  • 1048:有一门课不及格的学生
  • 数据结构——B-树、B+树、B*树
  • 2023国赛数学建模思路 - 案例:FPTree-频繁模式树算法
  • GPT系列总结
  • 【福建事业单位-综合基础知识】05民法典