查看: 4996|回复: 3

鸿蒙 uni-app x picker-view 内嵌选择器实战

[复制链接]
发表于 2026-9-18 09:00:00 | 显示全部楼层 |阅读模式
在鸿蒙平台的 uni-app x 开发中,picker-view 与 picker 虽然只差一个单词,但定位完全不同。picker 是从底部弹出的选择器,点击后才出现;picker-view 是直接嵌入页面的滚动选择器,适合时间选择页、日期选择页、自定义地址选择等需要常驻展示的场景。需要常驻表单里选值用 picker,自定义选择页面用 picker-view。在鸿蒙平台,uni-app x 从 4.61 开始支持 picker-view,与 picker 同期。

兼容性与选型
picker-view 比 picker 支持更早:Android 3.9、iOS 4.11 已支持,而 picker 到 5.08 才支持。因此如果 Android/iOS 项目版本低于 5.08,可以用 picker-view 替代 picker。这是跨端兼容选型时值得注意的一点。

组件结构与关键数据
picker-view 是容器,picker-view-column 表示每一列,列内放置选项列表。value 是下标数组,不是实际值。change 事件通过 event.detail.value 返回当前各列下标。indicator-style 控制选中框样式,mask-style 控制蒙层样式,pickstart 和 pickend 用来监听滚动开始和结束。下面以日期选择为例,2025 年在 years 数组中下标是 25,所以初始 value 可以写成 [25,5,24]。
  1. const dateValue = ref([25, 5, 24]) // 2025年6月25日
  2. const onDateChange = (event: UniPickerViewChangeEvent) => {
  3.   const val = event.detail.value
  4.   year.value = years[val[0]]
  5.   month.value = months[val[1]]
  6.   day.value = days[val[2]]
  7.   dateValue.value = val
  8. }
复制代码

时间选择需要三列时分秒,通常对个位数补零显示。自定义样式场景可通过 indicator-style 设置选中框高度、背景色和圆角,通过 mask-style 设置渐变蒙层,picker-view 自身可设置高度、背景和圆角。滚动监听场景则用 @pickstart 与 @pickend 更新“滚动中/停止”状态,适合在滚动结束后再做校验或联动。

动态列联动与索引越界
动态更新数据是 picker-view 最容易出问题的场景。以省市选择为例,省份变更后必须立即更新城市列表,并检查城市索引是否越界。如果新城市列表长度小于当前索引,要把 value 的对应列重置为 0,否则会出现选中项为空或显示错位。原文给出的处理逻辑是:change 中先更新省份,再替换 cities,若 val[1] >= cities.length 则把 value 设为 [val[0], 0],最后根据 value[1] 取城市;pickend 里再兜底更新一次城市。
  1. const onChange = (event: UniPickerViewChangeEvent) => {
  2.   const val = event.detail.value
  3.   value.value = val
  4.   province.value = provinces[val[0]]
  5.   cities.value = cityMap[province.value] || []
  6.   if (val[1] >= cities.value.length) {
  7.     value.value = [val[0], 0]
  8.   }
  9.   city.value = cities.value[value.value[1]]
  10. }
复制代码

适配与排障建议
第一,picker-view 的 value 始终按列下标维护,不要传实际文本;第二,列数据动态变化时要同步修正 value,尤其是联动选择;第三,选项 view 高度要与 indicator-style 高度一致,通常统一为 50px,避免选中框与文本错位;第四,Android/iOS 低版本可优先用 picker-view 规避 picker 5.08 的版本限制;第五,鸿蒙平台从 4.61 起支持,接入前确认 uni-app x 版本。picker-view 不是弹层组件,而是页面内嵌组件,适合把日期、时间、地区等选择器直接铺在表单或详情页中。
回复

使用道具 举报

发表于 2026-9-18 19:00:00 | 显示全部楼层

Re: 鸿蒙 uni-app x picker-view 内嵌选择器实战

感谢分享,写得很细。之前确实容易把 picker 和 picker-view 搞混,看到“常驻页面内嵌用 picker-view、底部弹层用 picker”这个区分就清楚了。日期例子用下标 value 很关键,尤其 2025 对应 25 这个点,新手很容易直接传实际文本。省市联动那段也很有用,动态换城市列表后必须判断索引越界并重置为 0,不然选中项为空或者显示错位确实很常见。版本兼容性方面,Android 3.9、iOS 4.11 就支持 picker-view,低版本项目可以先用它替代 picker,鸿蒙 4.61 起支持这个信息也记下了。还有 indicator-style 和选项高度统一 50px 这点很实用,收藏了。
回复 支持 反对

使用道具 举报

发表于 2026-9-18 19:30:00 | 显示全部楼层

Re: 鸿蒙 uni-app x picker-view 内嵌选择器实战

感谢分享,正好最近在鸿蒙上做日期选择页,picker 和 picker-view 的区别一下就清楚了。常驻表单里选值用 picker,自定义选择页面用 picker-view,这个选型思路很实用。版本兼容那段也提醒到位了,Android 3.9、iOS 4.11 已支持,鸿蒙从 uni-app x 4.61 开始,低版本可以先用 picker-view 绕开 picker 5.08 的限制。动态列联动和索引越界是我最容易忽略的地方,省市切换后如果城市列表变短,确实要马上把 value 对应列重置为 0,不然选中项为空或错位。还有 value 始终按下标维护、选项高度和 indicator-style 统一 50px,这两个细节很关键,我准备在项目里按这个来。想再确认一下,如果城市列表为空,文中最后取 city 时是不是还要再兜底一个默认值?感谢。
回复 支持 反对

使用道具 举报

发表于 2026-9-18 19:30:00 | 显示全部楼层

Re: 鸿蒙 uni-app x picker-view 内嵌选择器实战

感谢分享,这篇把 picker-view 的定位和坑点讲得挺透。picker 和 picker-view 虽然名字接近,但一个弹层一个内嵌,选型上“常驻表单选值用 picker,自定义选择页用 picker-view”这个区分很实用。value 按列下标维护这一点尤其重要,很容易误传成实际文本;动态列联动时检查索引越界、必要时重置为 [val[0], 0],再加上 pickend 兜底,这个处理思路很稳。版本兼容信息也有参考价值,Android 3.9、iOS 4.11、鸿蒙 4.61 支持 picker-view,而 picker 到 5.08,低版本项目可以考虑替代方案。日期初始 value [25,5,24] 和选项高度统一 50px 这些细节也很接地气,收藏了。期待后续更多鸿蒙 uni-app x 的实战。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-7 03:10 , Processed in 0.031755 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部