背景
react-native-datepicker(以下简称 DatePicker)是用 react-native 开发移动端 app 时常用到的时间选择控件,但是在 IOS 上会有一个问题:如果 DatePicker 在选择日期模式下,日期中年份默认选择当年,而且不能修改
解决方案一
通过将 Date mode 和 Time mode 的两个 DatePicker 控件拼接的方式从设计上拼接成 DateTime mode 的方式,如下 demo 所示(图上借阅时间部分):
解决方案二
原理:
- 基于 DatePicker 控件,创建一个新的控件(以下简称 NewDatePicker)
- 本质上依然是通过 Date mode 和 Time mode 两个 DatePicker 控件拼接的方式
- 将拼接的过程放在 NewDatePicker 控件内部实现,不展露于外
- 将日期+时间的选择过程在 NewDatePicker 控件内部流程化,减少不必要的交互行为
具体实现流程:
- 界面上只放置一个输入框
- 当用户触摸输入框的时候,激活 Date mode 的 DatePicker 控件,同时给此控件绑定 onDateChange 事件,当用户选择日期完成时,即触发此事件
- 当触发 onDateChange 事件时,进入处理函数,函数中执行激活 Time mode 的 DatePicker 控件,同时给此控件绑定 onTimeChange 事件,当用户选择时间完成时,即触发此事件
- 当触发 onTimeChange 事件时,进入处理函数,函数中执行将 Date mode 的 DatePicker 控件中选择的日期和 Time mode 的 DatePicker 控件中选择的时间通过字符串的方式拼接起来,并传到界面上的输入框中
- 最后,如果用户再次触摸界面上的输入框,程序需要回传输入框中的时间数据到 NewDatePicker 控件中,过程首先需要对时间数据进行拆分,拆分成日期和时间,然后执行内部流程 2 – 3 步骤,在这两个步骤中将日期和时间分别传入激活中的 Date mode 和 Time mode 的 DatePicker 控件中,然后用户可以修改时间,时间修改后执行内部流程中第 4 步骤,从而即形成循环操作
两种方案比较:
方案一:
- 不需要对 DatePicker 控件进行二次封装
- 需要在界面上展示两个 DatePicker 控件,增加交互的复杂性
- 程序中还需要额外对两个控件的结果进行拼接操作,增加代码逻辑的复杂性
方案二:
- 需要对 DatePicker 控件进行二次封装
- 界面交互变动很小,在一定程度上降低了界面交互复杂度
- 日期和时间的拼接、拆分逻辑都放在 NewDatePicker 控件内部完成;在业务代码中,只需要引入此控件,并实例化即可,高内聚、低耦合,傻瓜操作,便捷准确