UniApp 实现的日期选择器与时间选择器组件

在移动应用开发中,日期选择器和时间选择器是表单、预约、日程、打卡等场景中不可或缺的基础组件。一个好用的日期/时间选择器不仅能提升用户体验,还能有效减少输入错误。随着 HarmonyOS(鸿蒙)生态的不断壮大,开发一套兼容鸿蒙的日期与时间选择器组件变得尤为重要。本文将结合 UniApp 跨平台开发的优势,详细讲解如何实现一个高效、易扩展、适配鸿蒙的日期和时间选择器组件,并分享实际案例和鸿蒙适配经验。

为什么要自定义日期/时间选择器?

虽然 UniApp 提供了 uni-datetime-pickeruni-picker 等基础能力,但在实际项目中,往往会遇到如下需求:

  • 支持日期、时间、日期时间等多种模式;
  • 支持自定义样式、格式、占位符、禁用范围等;
  • 兼容多端,尤其是 HarmonyOS 设备的适配和体验优化;
  • 支持表单校验、联动、快捷选择等高级功能。

自定义组件不仅能满足个性化需求,还能提升整体产品体验和品牌一致性。

组件设计思路

设计一个日期/时间选择器组件,需要考虑以下几个方面:

  1. 多模式支持:日期、时间、日期时间、年月等多种选择模式。
  2. 交互体验:弹窗选择、滑动选择、快捷选项、禁用日期等。
  3. 样式定制:支持自定义颜色、图标、占位符、动画等。
  4. 鸿蒙适配:在鸿蒙端保证弹窗、滑动、动画等能力正常。
  5. 易用性与扩展性:props 设计合理,便于业务集成和后续扩展。

组件实现

我们以一个通用的 DateTimePicker 组件为例,支持日期、时间、日期时间三种模式。

1. 组件结构

components/date-time-picker/date-time-picker.vue 下新建组件:

<template><view class="dt-picker"><inputclass="dt-input":placeholder="placeholder":value="displayValue"readonly@click="openPicker"/><pickerv-if="mode === 'date'"mode="date":value="dateValue":start="start":end="end"@change="onDateChange":disabled="disabled"/><pickerv-else-if="mode === 'time'"mode="time":value="timeValue"start="00:00"end="23:59"@change="onTimeChange":disabled="disabled"/><pickerv-elsemode="datetime":value="dateTimeValue":start="start":end="end"@change="onDateTimeChange":disabled="disabled"/></view>
</template><script>
export default {name: 'DateTimePicker',props: {value: {type: String,default: ''},mode: {type: String,default: 'date' // date, time, datetime},placeholder: {type: String,default: '请选择日期/时间'},start: {type: String,default: ''},end: {type: String,default: ''},disabled: {type: Boolean,default: false},format: {type: String,default: '' // 可自定义显示格式}},data() {return {show: false};},computed: {displayValue() {if (!this.value) return '';if (this.format) {// 可扩展为格式化显示return this.value;}return this.value;},dateValue() {return this.value ? this.value.split(' ')[0] : '';},timeValue() {return this.value ? this.value.split(' ')[1] : '';},dateTimeValue() {return this.value || '';}},methods: {openPicker() {// 兼容部分端需手动触发 picker// 这里直接依赖 input 的点击弹出 picker},onDateChange(e) {const val = e.detail.value;this.$emit('input', val);this.$emit('change', val);},onTimeChange(e) {const val = e.detail.value;this.$emit('input', val);this.$emit('change', val);},onDateTimeChange(e) {const val = e.detail.value;this.$emit('input', val);this.$emit('change', val);}}
};
</script><style scoped>
.dt-picker {width: 100%;position: relative;margin-bottom: 32rpx;
}
.dt-input {width: 100%;height: 88rpx;border: 1rpx solid #e5e5e5;border-radius: 12rpx;padding: 0 24rpx;font-size: 32rpx;background: #f8f8f8;color: #333;
}
</style>

2. 组件使用与页面集成

在页面中引用并使用 DateTimePicker 组件,实现日期、时间、日期时间选择:

<template><view class="demo-dt-picker"><date-time-picker v-model="date" mode="date" placeholder="选择日期" /><date-time-picker v-model="time" mode="time" placeholder="选择时间" /><date-time-picker v-model="datetime" mode="datetime" placeholder="选择日期时间" /><text class="result">日期:{{ date }} 时间:{{ time }} 日期时间:{{ datetime }}</text></view>
</template><script>
import DateTimePicker from '@/components/date-time-picker/date-time-picker.vue';export default {components: { DateTimePicker },data() {return {date: '',time: '',datetime: ''};}
};
</script><style scoped>
.demo-dt-picker {padding: 40rpx;
}
.result {margin-top: 32rpx;color: #666;font-size: 28rpx;
}
</style>

3. HarmonyOS 适配与优化建议

  • 弹窗体验:鸿蒙端对 picker 弹窗支持良好,建议多端真机测试。
  • 格式化显示:可结合 dayjs/moment.js 等库自定义日期时间格式。
  • 禁用范围:可根据业务需求设置 start/end 限制选择范围。
  • UI 细节:鸿蒙设备分辨率多样,建议用 vw/rpx 单位自适应。
  • 无障碍支持:为输入框和 picker 添加 aria-label,提升可访问性。

4. 实际案例与体验优化

在某鸿蒙快应用项目中,日期/时间选择器广泛应用于预约、打卡、日程等场景,结合表单校验和快捷选项,极大提升了用户体验。实际开发中还可结合以下优化:

  • 支持快捷选择"今天"“明天”"本周末"等;
  • 选择后自动校验并高亮错误;
  • 结合表单联动,选择日期后自动刷新相关数据;
  • 只读模式下支持展示历史记录。

总结

基于 UniApp 的日期/时间选择器组件方案,既能兼容 HarmonyOS 生态,也能满足多端统一开发需求。通过灵活的 props 设计、交互优化和样式定制,可以为用户带来高效、友好的日期时间选择体验。希望本文能为你的鸿蒙/UniApp 项目提供实用参考。


如有问题或更好的实现思路,欢迎留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/82533.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/82533.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/82533.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式开发STM32 -- 江协科技笔记

1.背景介绍及基础认知 8大输入输出 斯密特触发器&#xff1a;高于设定阈值输出高电平&#xff0c;低于设定阈值输出低电平 有关上拉输入、下拉输入、推挽输出、开漏输出、复用开漏输出、复用推挽输出以及浮空输入、模拟输入的区别 1、上拉输入&#xff1a;上拉就是把电位拉高…

RISC-V 开发板 MUSE Pi Pro RTSP 串流 CSI ov5647 摄像头

视频链接&#xff1a;RISC-V 开发板 MUSE Pi Pro RTSP 串流 CSI ov5647 摄像头_哔哩哔哩_bilibili RISC-V 开发板 MUSE Pi Pro RTSP 串流 CSI ov5647 摄像头 RTSP&#xff08;Real-Time Streaming Protocol&#xff0c;实时流传输协议&#xff09; 是一种基于文本的应用层协议&…

Python面试1

1. 解释型语言和编译型语言的区别 编译型语言&#xff1a; 将程序编译成二进制可执行程序&#xff08;C、C) 解释型语言&#xff1a; 将程序逐行解释运行&#xff08;python&#xff09; Java不是将源程序直接编译机器语言&#xff0c;而是编译成字节码文件&#xff0c;然后用…

输入一串字符,统计其中字母的个数

#include <stdio.h> int main() { char ch; int count 0; printf("请输入一串字符&#xff1a;\n"); while ((ch getchar())! \n) { if ((ch > a && ch < z) || (ch > A && ch < Z)) { count; } } printf("字母的个数为&a…

git基础语法回顾

1. 初始化与克隆 git init 初始化一个新的本地仓库。git clone <repo-url> 克隆远程仓库到本地&#xff08;如 git clone https://github.com/user/repo.git&#xff09;。 2. 基础操作 git add <file> 将文件添加到暂存区&#xff08;如 git add main.py&#x…

华为仓颉语言初识:结构体struct和类class的异同

前言 华为仓颉语言是鸿蒙原生应用的一种新的编程语言&#xff0c;采用面向对象的编程思想&#xff0c;为开发者带来新的开发体验。不仅可以和 ArkTs 相互调用&#xff0c;更能提升应用程序的性能&#xff0c;更重要的是仓颉语言的特点结合了 java 和 C 的特点。对开发者来说比…

电池预测 | 第28讲 基于CNN-GRU的锂电池剩余寿命预测

电池预测 | 第28讲 基于CNN-GRU的锂电池剩余寿命预测 目录 电池预测 | 第28讲 基于CNN-GRU的锂电池剩余寿命预测预测效果基本描述程序设计参考资料 预测效果 基本描述 电池预测 | 第28讲 基于CNN-GRU的锂电池剩余寿命预测 运行环境Matlab2023b及以上&#xff0c;锂电池剩余寿…

在 Ubuntu 24.04 LTS 上 Docker 部署 DB-GPT

一、DB-GPT 简介 DB-GPT 是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL(Agentic Workflow Expression Language) and Agents)。目的是构建大模型领域的基础设施&#xff0c;通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及…

早停策略和模型权重的保存

知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xff0c;加载权重后继续训练50轮&#xf…

DeepSpeed-Ulysses:支持极长序列 Transformer 模型训练的系统优化方法

DeepSpeed-Ulysses&#xff1a;支持极长序列 Transformer 模型训练的系统优化方法 flyfish 名字 Ulysses “Ulysses” 和 “奥德修斯&#xff08;Odysseus&#xff09;” 指的是同一人物&#xff0c;“Ulysses” 是 “Odysseus” 的拉丁化版本 《尤利西斯》&#xff08;詹姆…

Redis-基础-总结

一、概述 Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数据结构&#xff0c;例如String、Hash、List、Set、sortedset等等。数据是存在内存中的&#xff0c;同时Redis…

尚硅谷redis7 28-32 redis持久化之理论介绍

28redis持久化之理论介绍 redis持久化&#xff1a;redis如何将内存数据写入磁盘中 为什么需要持久化&#xff1f; 内存数据一断电就会消失&#xff0c;那么所有的请求都会打到数据库中。因此让redis中的数据长期持有&#xff0c;不管是重启、故障、恢复、宕机&#xff0c;还…

JS逆向【抖查查】逆向分析 | sign | secret签名验证

1.目标 目标网址&#xff1a;https://www.douchacha.com/bloggerRankingRise 切换日期出现目标请求 import requests import jsonheaders {"accept": "application/json, text/plain, */*","accept-language": "zh-CN,zh;q0.9","…

【数据仓库面试题合集④】SQL 性能调优:面试高频场景 + 调优策略解析

随着业务数据规模的持续增长,SQL 查询的执行效率直接影响到数据平台的稳定性与数据产出效率。因此,在数据仓库类岗位的面试中,SQL 性能调优常被作为重点考察内容。 本篇将围绕常见 SQL 调优问题,结合实际经验,整理出高频面试题与答题参考,助你在面试中游刃有余。 🎯 高…

python打卡训练营打卡记录day37

知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xff0c;加载权重后继续训练50轮&#xf…

卷积神经网络(CNN)深度讲解

卷积神经网络&#xff08;CNN&#xff09; 本篇博客参考自大佬的开源书籍&#xff0c;帮助大家从头开始学习卷积神经网络&#xff0c;谢谢各位的支持了&#xff0c;在此期待各位能与我共同进步​ 卷积神经网络&#xff08;CNN&#xff09;是一种特殊的深度学习网络结构&#x…

深度体验:海螺 AI,开启智能创作新时代

人工智能 AI 工具如雨后春笋般涌现&#xff0c;而海螺 AI 以其独特的魅力与卓越的性能&#xff0c;迅速在众多产品中崭露头角&#xff0c;成为了无数创作者、办公族以及各行业人士的得力助手。近期&#xff0c;我对海螺 AI 进行了深入的使用体验&#xff0c;接下来就为大家详细…

哈希表day5

242 有效的字母异位词 思路就是转为ASCII码&#xff0c;然后用一个数组记录26位字母出现的次数 #include <string> class Solution{ public:bool isAnagram(string s,string t){int record[26]{0};for (int i0;i<s.size();i){record[s[i]-a];}for (int i0;i<t.si…

【Python数据库全栈指南】从SQL到ORM深度实践

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…

Android磁盘占用优化全解析:从监控到治理的存储效率革命

引言 随着移动应用功能的复杂化&#xff0c;磁盘占用问题日益突出。据统计&#xff0c;国内头部应用的平均安装包大小已超100MB&#xff0c;运行时缓存、日志、图片等数据更可能使磁盘占用突破GB级。过度的磁盘消耗不仅影响用户设备空间&#xff0c;还可能触发系统的“应用数据…