uni-app中应直接使用picker组件的mode="time"实现时间选择,value必须为"HH:mm"格式字符串,不可用input事件手动格式化;需拆分日期与时间两个picker以实现精准联动和校验。

uni-app里用picker实现时间选择,别自己写组件
uni-app 官方 picker 组件原生支持时间选择,mode="time" 就能直接调起系统级时间选择器,iOS 和 Android 行为一致,无需额外兼容。自己封装 input + 滚动列表不仅体验差(无原生动画、无法呼出系统键盘辅助),还容易在 H5 端 fallback 失败。
常见错误是试图监听 input 事件手动格式化时间字符串,结果在微信小程序里点不弹窗、在 H5 里显示为文本框——因为没设 mode 或写成了 type="time"(这是 HTML 原生属性,uni-app 不认)。
-
picker必须设置mode="time",且绑定value为 HH:mm 格式字符串(如"09:30") - 触发方式只能是用户点击,不能用
ref调用show()(H5 不支持) - H5 端会降级为
<input type="time">,所以务必保证初始value符合HH:mm格式,否则输入框为空或报错 - 如果需要“时分秒”,
mode="time"不支持;得换mode="selector"自定义三列,但失去原生体验
日期+时间联动:用两个picker比一个mode="datetime"更可控
mode="datetime" 看似省事,但实际问题多:iOS 上无法单独禁用年份滚动、Android 部分机型只显示年月日、H5 端完全不支持(直接退化成文本框)。真正要实现「选日期后,时间默认设为当天 09:00,且时间不能早于当前时间」这类逻辑,必须拆成两个 picker 分别控制。
关键在联动时机:日期变更后,时间 value 必须重置并校验。不要等用户点确认再处理——change 事件触发时就要更新时间值,并同步到 data。
- 日期
picker的value是"2024-05-20"格式;时间picker的value是"09:30"格式;两者拼起来才是完整时间戳 - 时间校验必须在日期变更后立刻做:比如选了明天,时间就不能还保留今天 23:59,得重置为
"00:00"或业务默认值 - 避免在
change里直接修改同一picker的value(可能触发死循环),应通过setData更新另一个picker的绑定值
小程序真机调试时时间选择器不弹出?先查value格式和disabled
最常卡住的是:开发工具里好好的,真机一跑就点不动。大概率是 value 值非法或被意外禁用。
错误现象包括:点击无响应、console 报 Invalid prop: type check failed for prop "value"、H5 端显示为灰色不可编辑输入框。
-
value必须是字符串,不是 Date 对象或数字;"9:30"(少前导零)也不行,必须是"09:30" - 检查是否误加了
disabled属性(比如 v-bind:disabled="loading" 但 loading 初始为 true) - 微信小程序要求
picker必须有明确高度(哪怕height: 1px),否则在某些安卓机型上渲染异常 - App 端如果用了 nvue 页面,
picker不可用,必须改用uni-datetime-picker或原生插件
需要精确到秒或带 AM/PM?放弃mode="time",改用mode="selector"自定义
原生 mode="time" 只支持 24 小时制的 HH:mm,没有秒、没有上午下午标识。想显示 "2:30 PM" 或选 "14:30:45",只能用 mode="selector" 手动配三列数据。
这不是偷懒就能绕开的限制——iOS 系统时间选择器本身就不提供秒选择,AM/PM 是区域设置决定的,uni-app 无法干预。所以业务真有此需求,就得接受定制成本。
- 三列数据结构示例:小时(1–12)、分钟(00–59)、AM/PM(["AM", "PM"]),然后在 change 里拼装并转 24 小时制
- 注意时区:
new Date().getHours()返回本地时区小时,若需 UTC 时间,得手动转换 - 性能影响小,但包体积会略增(多加载一列数据);H5 端体验不如原生
input[type="time"],慎用于高频操作场景

















