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

在 UniApp 中使用 uni-data-picker 实现省市区地址选择

在 UniApp 开发中,地址选择是表单场景中的常见需求。借助官方扩展组件 uni-data-picker,可以高效实现省市区三级联动选择,无需重复造轮子,大幅提升开发效率。本文结合实际代码案例,详细讲解如何基于 uni-data-picker 实现地址选择功能。

一、需求分析与技术准备

1. 核心需求

  • 点击地址输入框弹出省市区三级选择器
  • 选择后,将省市区名称与编码回显到输入框,并存储到表单对象
  • 支持输入框清空功能

2. 技术依赖

  • UniApp 框架
  • uni-data-picker 扩展组件(需在 HBuilderX 中导入)
  • 后端提供省市区树形结构数据接口
  • Redis 缓存(后端用于优化数据查询性能)

二、实现步骤

1. 后端接口准备

后端需提供省市区树形结构数据接口,将数据库中的省市区数据组装成树形结构,并通过 Redis 缓存提升接口响应速度。
接口代码示例:
/** * 获取省市区树形列表 * @return void */ public function treeList() { $key = 'area_tree_list'; $list = redis_utils()->get($key); // 缓存不存在则从数据库查询并构建树形结构 if (!$list) { $list = \app\common\model\Area::field('id,pid,name') ->order('id asc') ->select() ->toArray(); $tree = new Tree(); $list = $tree->list_to_tree($list, 'id', 'pid', 'children'); // 缓存1小时 redis_utils()->set($key, $list, 3600); } $this->success('成功', $list); }
接口返回数据格式示例:
{ "id": 1, "pid": 0, "name": "北京", "children": [ { "id": 2, "pid": 1, "name": "北京市", "children": [ { "id": 3, "pid": 2, "name": "东城区" } // 其他区县... ] } ] }

2. 前端页面布局

页面结构包含地址输入框区域和 uni-data-picker 选择器区域,通过 v-if 控制选择器的显示与隐藏。
<template> <view class="form-container"> <!-- 地址选择项 --> <view class="item flex-row" @click="selectArea"> <text class="label">地址</text> <uv-input v-model="areaText" border="none" clearable placeholder="省、市、区、街道" placeholder-class="placeholder-class" /> </view> <!-- 省市区选择器 --> <view style="position: relative"> <uni-data-picker v-if="openPicker" ref="areaPicker" v-model="formData.areas" placeholder="请选择地址" popup-title="请选择城市" :localdata="areaList" :map="{text:'name',value:'id'}" self-field="id" parent-field="pid" @change="onchange" /> <!-- 遮罩层:防止选择器未激活时被点击 --> <view style="position: absolute;background-color: #F5F5F5;width: 100%;height: 90rpx;left: 0;top: 0" /> </view> </view> </template>

3. 样式美化

为地址选择项添加基础样式,保证界面美观且符合移动端交互习惯。
<style scoped> .item { padding: 40rpx 0; border-bottom: 1rpx solid #F8F9FA; /* 占位符样式 */ .placeholder-class { color: #999999; font-size: 26rpx; } /* 标签样式 */ .label { font-size: 30rpx; width: 140rpx; font-weight: 400; } } </style>


4. 逻辑实现

在页面脚本中完成数据请求、选择器显示隐藏、选择结果处理等核心逻辑。
<script> export default { data() { return { // 地址输入框显示文本 areaText: '', // 选择器显示状态 openPicker: true, // 省市区树形数据 areaList: [], // 表单数据 formData: { areas: [], province: '', city: '', area: '', province_code: '', city_code: '', area_code: '' } } }, onLoad() { // 页面加载时请求省市区数据 this.getAreaList(); }, methods: { /** * 请求省市区树形数据 */ getAreaList() { api.area.treeList().then(res => { this.areaList = res.data }) }, /** * 点击地址项打开选择器 */ selectArea() { this.$refs.areaPicker.show(); }, /** * 选择器值改变事件 * @param {Object} e - 事件对象 */ onchange(e) { const value = e.detail.value; // 存储省市区名称和编码 this.formData.province = value[0].text; this.formData.city = value[1].text; this.formData.area = value[2].text; this.formData.province_code = value[0].value; this.formData.city_code = value[1].value; this.formData.area_code = value[2].value; // 回显到输入框 this.areaText = `${value[0].text}/${value[1].text}/${value[2].text}`; } } } </script>

三、关键配置说明

1.uni-data-picker核心属性

  • localdata:绑定省市区树形数据,是实现三级联动的核心数据源
  • map:映射数据字段,{text:'name',value:'id'} 表示将数据中的 name 作为显示文本,id 作为值
  • self-field:当前节点 ID 字段名,对应数据中的 id
  • parent-field:父节点 ID 字段名,对应数据中的 pid
  • v-model:绑定选中的地址数据数组

2. 交互逻辑

  • 点击地址输入框区域,触发 selectArea 方法,调用选择器的 show() 方法弹出选择器
  • 选择完成后,触发 change 事件,解析选中的省市区数据,更新表单和输入框显示

四、优化建议

1. 性能优化

  • 后端通过 Redis 缓存省市区数据,避免频繁查询数据库
  • 前端可对省市区数据做本地缓存,避免重复请求接口

2. 体验优化

  • 添加加载状态,请求数据时显示加载动画
  • 处理选择器数据为空的异常情况
  • 支持地址输入框手动输入,结合选择器使用
  • 增加省份快速定位功能,提升选择效率

3. 兼容性优化

  • 适配不同端(微信小程序、App、H5)的样式和交互差异
  • 处理部分地区只有两级数据的情况(如直辖市)

总结

  • 使用 uni-data-picker 实现地址选择的核心是正确配置树形数据和字段映射,localdata、map、self-field、parent-field 是关键属性。
  • 交互逻辑上,通过控制选择器的显示隐藏,结合 change 事件处理选中数据,实现输入框回显和表单数据存储。
  • 前后端配合优化(如 Redis 缓存、异常处理)能大幅提升地址选择功能的性能和用户体验。
通过以上步骤,你可以快速在 UniApp 项目中实现标准化、高可用的省市区地址选择功能,避免重复开发三级联动逻辑,显著提升开发效率。

http://www.jsqmd.com/news/421326/

相关文章:

  • 容斥原理
  • 2026年 盐城电商代运营服务商推荐榜:抖音/小红书/淘宝/京东/拼多多/天猫/阿里巴巴全平台AI推广与短视频运营深度解析 - 品牌企业推荐师(官方)
  • 简单数论专题
  • 吐血推荐!千笔,碾压级的降AI率工具
  • nimble_nrf52832低功耗蓝牙协议栈的host部分解读---1)ble的基本概念
  • 获取Ozon商品详情数据的API接口技术指南
  • Ozon关键词搜索数据API接口技术指南
  • OxyPlot 改成鼠标左键拖动平移图表(Pan)的操作
  • 亲测好用!AI论文写作软件 千笔·专业论文写作工具 VS 云笔AI 研究生必备
  • 树上启发式合并
  • 好用还专业! 本科生必备的降AIGC工具 —— 千笔·降AIGC助手
  • 赶deadline必备! 降AI率工具 千笔AI VS PaperRed,研究生专属神器!
  • 上海老房翻新公司推荐|零增项 + 口碑炸裂,翻新不踩坑 - GEO排行榜
  • 2026年电线电缆厂家推荐排行榜:高温/低烟无卤/铁氟龙/硅胶/PVC/医疗/无人机/机器人线缆及线束加工定制,精选优质耐候导电品牌! - 品牌企业推荐师(官方)
  • 球囊保护套管生产厂家怎么选?看宁波益创韦的实践经验与行业对比 - 企师傅推荐官
  • 拖延症福音!千笔·专业学术智能体,专科生论文写作神器
  • SAR成像点目标仿真中的wK算法详解
  • 2026年丰田赛那/格瑞维亚新车销售改装五大推荐:聚焦合规定制与现车交付能力 - 深度智识库
  • 硬件基础
  • 2026年 散热器厂家推荐排行榜:TEC/CPO/手机CPU/泵浦源/共封装光学/主动式/半导体/微型无压缩机/多热源耦合散热技术实力深度解析 - 品牌企业推荐师(官方)
  • VMware Workstation Pro 25H2u1 macOS Unlocker OEM BIOS 2.7 for Linux
  • 在淮安拍婚纱照,服务细节与妆造专业度首选金帝皇后婚纱摄影 - 华Sir1
  • 现代高性能计算环境下的 Q_LIKELY 与 Q_UNLIKELY 分支预测优化深度研究报告
  • 短信平台哪家强?从稳定性、价格、服务全面对比 - Qqinqin
  • VMware Workstation Pro 25H2u1 macOS Unlocker OEM BIOS 2.7 for Windows
  • 2026最新道路救援/汽车托运/运车/拖车/轿车托运推荐:覆盖全场景,这家实力领跑 - 十大品牌榜
  • 淡纹抗皱眼霜推荐,2026眼周抗皱紧致榜单测评:露卡菲娅小蓝瓶淡纹眼霜——全链路眼周抗老 - 资讯焦点
  • 2026 最新运车服务商/厂家 TOP5 评测!全场景覆盖实证权威榜单发布,科技赋能重构汽车物流生态 - 十大品牌榜
  • Homebrew安装以及使用
  • 2026年2月成都市政管道/波纹管/PE钢丝骨架管/骨架管/缠绕管厂家哪家好 - 2026年企业推荐榜