跨平台日期选择组件
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 | ||
| 12 天前 |
react-native-datepicker
本项目基于 react-native-datepicker 开发。如果在使用过程中有任何问题,欢迎在 AtomGit 提交 Issue,会及时跟进。
项目介绍
@hxa-rn/react-native-datepicker 是 react-native-datepicker v1.7.2 的鸿蒙(OpenHarmony)适配版本,当前版本 1.7.3。
本模块为 js-only(纯 JS) 日期/时间选择器组件:点击输入框弹出底部 Modal 面板,通过自研 HarmonyDatePicker 列式滚轮完成选择,基于 Moment.js 解析与格式化日期字符串,支持 date / datetime / time 三种模式,以及范围限制、自定义样式、图标与回调等能力。
与原库差异简述:
- 原库 Android 端使用
DatePickerAndroid/TimePickerAndroid系统对话框;鸿蒙端改为自研滚轮面板。 - 原库 iOS 端使用
DatePickerIOS;鸿蒙端以HarmonyDatePicker(RN 核心FlatList+snapToInterval)替代,交互语义(打开 → 滚轮选择 → 确认/取消)保持一致。
集成指南
安装鸿蒙适配包:
npm install @hxa-rn/react-native-datepicker
在宿主工程 package.json 中配置 harmony.alias,使业务代码仍可使用原库名 import:
{
"harmony": {
"alias": "react-native-datepicker"
}
}
业务侧 import 示例:
import DatePicker from 'react-native-datepicker';
Peer 依赖:
| 依赖 | 版本要求 |
|---|---|
react-native |
>= 0.72 |
运行时依赖(随包装载): moment、prop-types。
本模块为 js-only,无需 Autolinking、HAR 编译或在 PackageProvider / CMakeLists.txt 中注册原生 Package。安装后直接 import 使用即可。发布产物为 JavaScript,不含 .d.ts;下面示例按 JS 编写。
使用说明
日期选择(mode="date")
import React, { Component } from 'react';
import DatePicker from 'react-native-datepicker';
export default class MyDatePicker extends Component {
state = { date: '2026-08-15' };
render() {
return (
<DatePicker
style={{ width: 200 }}
date={this.state.date}
mode="date"
placeholder="请选择日期"
format="YYYY-MM-DD"
minDate="2020-01-01"
maxDate="2030-12-31"
confirmBtnText="确定"
cancelBtnText="取消"
onDateChange={(dateStr, date) => {
this.setState({ date: dateStr });
}}
/>
);
}
}
日期时间选择(mode="datetime")
import React, { Component } from 'react';
import DatePicker from 'react-native-datepicker';
export default class MyDateTimePicker extends Component {
state = { date: '2026-08-15 14:30' };
render() {
return (
<DatePicker
date={this.state.date}
mode="datetime"
format="YYYY-MM-DD HH:mm"
onDateChange={(dateStr, date) => {
this.setState({ date: dateStr });
}}
/>
);
}
}
时间选择(mode="time")
import React, { Component } from 'react';
import DatePicker from 'react-native-datepicker';
export default class MyTimePicker extends Component {
state = { date: '14:30' };
render() {
return (
<DatePicker
date={this.state.date}
mode="time"
format="HH:mm"
is24Hour={true}
minuteInterval={5}
onDateChange={(dateStr, date) => {
this.setState({ date: dateStr });
}}
/>
);
}
}
手动打开/关闭面板
组件为 class 组件,可通过 ref 调用实例方法 onPressDate() 手动打开面板:
import React, { Component, createRef } from 'react';
import DatePicker from 'react-native-datepicker';
export default class ManualOpenExample extends Component {
datePickerRef = createRef();
openPicker = () => {
const picker = this.datePickerRef.current;
if (picker) {
picker.onPressDate();
}
};
render() {
return (
<DatePicker
ref={this.datePickerRef}
date="2026-08-15"
mode="date"
/>
);
}
}
面板打开后点击取消按钮或遮罩(未自定义 onPressMask 时)可关闭。
自定义样式
通过 customStyles 覆盖各部件样式,源码实际读取的 key 包括:dateTouchBody、dateInput、dateText、placeholderText、dateIcon、datePickerCon、datePicker、btnCancel、btnConfirm、btnTextCancel、btnTextConfirm、disabled。外层容器宽度/布局请用组件的 style,不会读取 customStyles.dateTouch。
接口文档
导出默认组件 DatePicker(class 组件)。
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mode |
'date' | 'datetime' | 'time' |
'date' |
选择模式 |
date |
string | Date |
'' |
当前/初始日期;空时打开面板默认定位当前时间(并收敛到 min/max 范围) |
format |
string |
随 mode:YYYY-MM-DD / YYYY-MM-DD HH:mm / HH:mm |
Moment 格式化模板 |
minDate |
string | Date |
— | 最小可选日期 |
maxDate |
string | Date |
— | 最大可选日期 |
placeholder |
string |
'' |
日期为空时的占位文案 |
confirmBtnText |
string |
'确定' |
确认按钮文案 |
cancelBtnText |
string |
'取消' |
取消按钮文案 |
is24Hour |
boolean |
随 format 推断(含 h/a 时为 12 小时制) |
是否 24 小时制 |
minuteInterval |
number |
— | 分钟选项步进间隔 |
showIcon |
boolean |
true |
是否显示日期图标 |
iconSource |
number | {uri: string} |
内置 date_icon.png |
图标资源 |
iconComponent |
element |
— | 自定义图标组件(优先于 iconSource) |
disabled |
boolean |
false |
禁用时点击不弹出面板 |
hideText |
boolean |
false |
隐藏日期文本 |
allowFontScaling |
boolean |
true |
日期文字是否随系统字体缩放 |
customStyles |
object |
{} |
各部件自定义样式 |
TouchableComponent |
Component |
TouchableHighlight |
底层触摸组件 |
getDateStr |
(date: Date) => string |
— | 自定义日期字符串格式化函数 |
height |
number |
259 |
面板高度(px) |
duration |
number |
300 |
面板弹出/收起动画时长(ms) |
locale |
string |
— | 会传给 HarmonyDatePicker,但当前实现未使用该值:滚轮列标签不本地化,getDateStr 也不会按 locale 调用 moment |
androidMode |
'clock' | 'calendar' | 'spinner' | 'default' |
'default' |
兼容字段,鸿蒙端无实际效果 |
modalAccessory |
ReactNode |
— | 面板顶部附加内容 |
回调
| 回调 | 签名 | 说明 |
|---|---|---|
onDateChange |
(dateStr: string, date: Date) => void |
点击确认后触发;dateStr 为格式化字符串,date 为 Date 对象 |
onOpenModal |
() => boolean | void |
打开面板前触发;返回 false 时不打开面板 |
onCloseModal |
() => void |
面板关闭时触发(确认或取消后) |
onPressMask |
() => void |
点击遮罩时触发;若传入该回调,组件不再自动执行默认取消关闭,需自行处理 |
实例方法
| 方法 | 说明 |
|---|---|
onPressDate() |
手动打开选择面板(等效点击输入框) |
onPressCancel() |
取消当前选择并关闭面板(等效点击取消按钮) |
快速验证(运行 Example)
前置条件
| 依赖 | 版本要求 |
|---|---|
| Node.js | >= 18(运行 Example 建议 >= 20,见 example/package.json) |
| DevEco Studio | 5.0+ / 6.0+ |
| HarmonyOS SDK | API 13+(example/harmony 的 compatibleSdkVersion 为 5.0.1(13)) |
运行步骤
1. 克隆仓库
git clone https://gitcode.com/hxa-rn/react-native-datepicker.git
cd react-native-datepicker
git checkout main
2. 进入 example 目录,安装依赖
cd example
npm install --legacy-peer-deps
Example 已改为从 npm 公仓安装 @hxa-rn/react-native-datepicker@^1.7.3,不再使用本地 file:../xxx.tgz,运行 Example 不必再执行 npm pack。
3. 生成 JS Bundle
npm run dev
产物:harmony/entry/src/main/resources/rawfile/bundle.harmony.js
4. 安装鸿蒙依赖
cd harmony
ohpm install
5. 用 DevEco Studio 打开鸿蒙工程
- 打开 DevEco Studio
- 选择
example/harmony目录 - 首次构建请在 File → Project Structure → Signing Configs 勾选 Automatically generate signature,Apply 后 Sync
- 等待 Sync 完成
6. 编译并运行 HAP
在 DevEco Studio 中点击运行按钮,将 HAP 安装到设备/模拟器。
注意:本模块为 js-only,Example 无需 Autolinking、HAR 编译或原生 Package 注册。编 HAP 前必须先执行
npm run dev。
约束与限制
| 项 | 要求 |
|---|---|
| React Native(RNOH) | 0.72(peerDependencies >= 0.72) |
| HarmonyOS SDK | API 13+(example/harmony 的 compatibleSdkVersion 为 5.0.1(13)) |
| Node.js | >= 18(engines);运行 Example 建议 >= 20 |
| 权限 | 纯 JS 组件,无额外系统权限 |
| 架构 | js-only,无 HAR / 原生模块,无需 Autolinking |
| 平台差异 | 鸿蒙端使用自研 HarmonyDatePicker 滚轮面板,不使用 DatePickerAndroid / TimePickerAndroid / DatePickerIOS |
androidMode |
兼容字段,鸿蒙端无实际效果 |
locale |
当前实现未使用该值,滚轮列标签与 getDateStr 均不按 locale 本地化 |
| 其他 | format 含 h/a 时默认 12 小时制;无效日期字符串不导致崩溃;滚轮对齐以真机为准 |
开源license
本项目基于 MIT 协议,详见 LICENSE 文件。
问题反馈渠道
如在集成或使用过程中遇到问题,可通过以下渠道反馈: