每位开发者都曾有过这样的时刻。
你需要一个日期选择器,于是开始搜索。
你找到一个完美无缺的……直到你发现它依赖 React。
或者 Vue。
或者 jQuery。
或者需要引入整个日期库才能挑选几个日期。
尝试过几种方案后,我一直在问自己:
为什么这样一个常见的 UI 组件往往比它本应有的样子更复杂?
于是我决定自己动手。
来认识一下 RollDate。
目标
我并不想造「又一个日期选择器」。
我想要打造一个在自己项目中真正愿意使用的组件。
目标很简单:
- 无限滚动
- 零框架依赖
- 简洁的 API
- 现代化的 UI
- 支持移动端滚动
- TypeScript 支持
- 易于定制
- 完善的文档
为什么采用滚动?
大多数日期选择器依赖点击微小的箭头或下拉菜单。
在移动设备上,这种交互往往不够流畅。
我希望它更接近原生移动端选择器——只需流畅地滚动就能切换月份或年份。
这也成为 RollDate 的核心理念之一。
不仅仅是挑选日期
在构建组件的过程中,我发现不同项目需要不同的选择模式。
因此,RollDate 支持以下模式,而无需维护多个组件:
- 单日期选择
- 日期范围选择
- 多日期选择
无论使用哪种模式,API 都保持一致。
new RollDate("#date", {
selectType: "range"
});
Enter fullscreen mode Exit fullscreen mode
可选时间选择器
很多日期选择器需要额外安装插件才能支持时间选择。
我希望它内置于组件之中。
RollDate 支持:
- 24 小时制
- 12 小时制(AM/PM)
- 可配置的分钟步长
只需一个选项即可启用。
new RollDate("#date", {
enableTime: true
});
Enter fullscreen mode Exit fullscreen mode
无依赖
设计目标之一就是让库保持独立。
无需 React。
无需 Vue。
无需 jQuery。
无需 Moment.js。
无需 Day.js。
只需纯 JavaScript。
这意味着它几乎可以在任何环境中运行:
- Vanilla JavaScript
- React
- Vue
- Angular
- Svelte
- Astro
- ……或任何支持 DOM 组件的框架。
更好的开发者体验
我非常重视开发者体验。
因此,我花在文档上的时间几乎与构建组件本身的时间相当。
项目包含:
- 可交互的在线演示
- 配置 Playground
- 自动生成的代码示例
- TypeScript 类型定义
- 完整的文档
我特别喜欢 Playground 这一功能。
当你修改选项时,生成的 JavaScript 配置会自动更新,让你轻松理解每个选项的作用。
我学到的东西
构建日期选择器远比我预期的更具挑战性。
并非因为渲染日历很困难。
难点在于处理各种边界情况:
- 日期范围
- 禁用日期
- 本地化
- 键盘与鼠标交互
- 时间选择
- 不同显示模式
- 一致的 API 设计
UI 本身只是工作的一小部分。
成果
RollDate 目前支持:
- ✅ 单选、范围选择与多选
- ✅ 弹出与内联模式
- ✅ 可选时间选择器
- ✅ 明暗主题
- ✅ 本地化
- ✅ 运行时 API
- ✅ TypeScript
- ✅ 零依赖
我仍在持续改进这个项目,真诚欢迎其他开发者提供反馈。
如果你有建议、想法或不同的做法,我很乐意听到你的声音。
链接
🌐 在线演示:https://rolldate-demo.vercel.app/
📦 npm:https://www.npmjs.com/package/@rolldate/core
⭐ GitHub:https://github.com/Abramov-Front-end/rolldate-core
感谢阅读!

0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.