@ray-js/smart-ui
Version:
轻量、可靠的智能小程序 UI 组件库
438 lines (374 loc) • 13.5 kB
Markdown
---
category: 数据录入
assets: CountdownActionSheet,LampScheduleSetFunction
---
# DateTimePicker 时间选择
### 介绍
用于选择时间,支持日期、时分等时间维度,通常与 [弹出层](/material/smartui?comId=popup) 组件配合使用。
### 引入
```jsx
import { DateTimePicker } from '@ray-js/smart-ui';
```
## 代码演示
### 选择完整时间
`value` 为时间戳。
```jsx
import React, { useCallback } from 'react';
import { DateTimePicker } from '@ray-js/smart-ui';
import { showToast } from '@ray-js/ray';
export default function Demo() {
const onDateTimeInput = useCallback(event => {
const { detail } = event;
showToast({
icon: 'none',
title: new Date(detail).toLocaleString(),
});
}, []);
return (
<DateTimePicker
type="datetime"
value={new Date(2018, 2, 31).getTime()}
minDate={new Date(2018, 0, 1).getTime()}
maxDate={new Date(2019, 10, 1).getTime()}
onInput={onDateTimeInput}
/>
);
}
```
### 选择日期(年月日)
`value` 为时间戳;通过传入 `locale` 属性加入单位描述;通过传入 `formatterMap` `v2.2.0` 属性可以对内部的日期进行替换。
```jsx
import React, { useCallback } from 'react';
import { DateTimePicker } from '@ray-js/smart-ui';
import { showToast } from '@ray-js/ray';
export default function Demo() {
const onDateInput = useCallback(event => {
const { detail } = event;
showToast({
icon: 'none',
title: new Date(detail).toLocaleString(),
});
}, []);
return (
<DateTimePicker
type="date"
value={new Date(2018, 2, 31).getTime()}
minDate={new Date(2018, 0, 1).getTime()}
maxDate={new Date(2019, 10, 1).getTime()}
locale={{
year: '年',
}}
formatterMap={{
month: {
'01': 'January',
'02': 'February',
'03': 'March',
'04': 'April',
'05': 'May',
'06': 'June',
'07': 'July',
'08': 'August',
'09': 'September',
'10': 'October',
'11': 'November',
'12': 'December',
},
day: '{{day}}天'
}}
fontStyles={{
day: {
fontFamily: 'Manrope',
},
}}
onInput={onDateInput}
/>
);
}
```
### 选择日期(年月)
`value` 为时间戳。
```jsx
import React, { useCallback } from 'react';
import { DateTimePicker } from '@ray-js/smart-ui';
import { showToast } from '@ray-js/ray';
export default function Demo() {
const onDateInput = useCallback(event => {
const { detail } = event;
const date = new Date(detail);
showToast({
icon: 'none',
title: `${date.getFullYear()}/${date.getMonth() + 1}`,
});
}, []);
return (
<DateTimePicker
type="year-month"
value={new Date(2018, 2, 31).getTime()}
minDate={new Date(2018, 0, 1).getTime()}
locale={{
year: '年',
month: '月',
day: '日',
}}
onInput={onDateInput}
/>
);
}
```
### 选择时间
`value` 为字符串。
```jsx
import React, { useCallback } from 'react';
import { DateTimePicker } from '@ray-js/smart-ui';
import { showToast } from '@ray-js/ray';
export default function Demo() {
const onTimeInput = useCallback(event => {
const { detail } = event;
showToast({
icon: 'none',
title: detail,
});
}, []);
return (
<DateTimePicker
type="time"
value="12:00"
minHour={10}
maxHour={20}
onInput={onTimeInput}
/>
);
}
```
### 选择时间-12小时模式`v2.6.0`
当设置`type: 'time'`时,可以开启`is12HourClock`属性实现12小时选择模式;`amText`、`pmText` 可以分别设置上午和下午的文案。
`columnsOrder`属性可以设置列的顺序,对应列的order越大,就会越靠后,同css的`flex order` 属性,只是从样式层面改变列的顺序,逻辑还是不变。
`fontStyles` 和 `columnStyles` 内的 `12HourClock` `v2.6.0` 可以修改对应12小时时区的样式。
```jsx
import React, { useCallback, useState } from 'react';
import { DateTimePicker } from '@ray-js/smart-ui';
import { showToast } from '@ray-js/ray';
export default function Demo() {
const [currentDate, setCurrentDate] = useState('11:00');
const onTimeInput = useCallback(event => {
const { detail } = event;
setCurrentDate(detail)
showToast({
icon: 'none',
title: detail,
});
}, []);
return (
<DateTimePicker
type="time"
value={currentDate}
is12HourClock
columnsOrder={[2, 1, 1]}
fontStyles={{
'12HourClock': {
color: 'var(--app-B6-N1,#000)',
},
}}
onInput={onTimeInput}
/>
);
}
```
### 关闭值改变动画 `v2.2.0`
`changeAnimation` 属性设置为`false`可以关闭因为`value`属性改变导致的组件更新动画效果。
```jsx
import React, { useCallback, useState } from 'react';
import { DateTimePicker } from '@ray-js/smart-ui';
import { showToast } from '@ray-js/ray';
export default function Demo() {
const [currentDate, setCurrentDate] = useState('11:00');
const onTimeInput = useCallback(event => {
const { detail } = event;
setCurrentDate(detail)
showToast({
icon: 'none',
title: detail,
});
}, []);
return (
<DateTimePicker
type="time"
value={currentDate}
changeAnimation={false}
onInput={onTimeInput}
/>
);
}
```
### 嵌套 Popup `v2.3.2`
当是Popup嵌套时我们往往会有确定和取消事件,为了方式关闭弹框的时候动画没有执行完毕,需要使用 `onAnimationStart` 和 `onAnimationEnd` 事件对 `onConfirm` 的回调执行做一个禁用的效果,等到动画执行完毕在可以点击确认。
其次为了解决用户点击取消后的恢复之前选中效果,可以设置 `show: false` 时 `value="-1:00"` 这样在次打开弹框时由于`value`不一样会触发组件重新定位到当前选中的时间。
```jsx
import React, { useCallback, useState } from 'react';
import { DateTimePicker, Cell, Popup } from '@ray-js/smart-ui';
import { View } from '@ray-js/ray';
export default function Demo() {
const [show, setShow] = React.useState(false);
const [popDomShow, setPopDomShow] = useState(false);
const [disabled, setDisabled] = useState(false);
const [time, setTime] = useState({
hour: 10,
minute: 0,
});
const showPicker = () => {
setPopDomShow(true);
setShow(true);
}
const onSaveTiming = event => {
if (disabled) return;
const { detail } = event;
const [hour, minute] = detail.split(':');
setTime({
hour: parseInt(hour.trim(), 10),
minute: parseInt(minute.trim(), 10),
});
setShow(false);
}
const onAnimationStart = () => {
console.log('onAnimationStart');
setDisabled(true);
};
const onAnimationEnd = () => {
console.log('onAnimationEnd');
setDisabled(false);
};
return (
<>
<Cell title="选择时间" isLink onClick={showPicker}>
{time.hour}:{time.minute}
</Cell>
<Popup
round
show={show}
position="bottom"
safeAreaInsetBottom={false}
closeOnClickOverlay={false}
onAfterLeave={() => setPopDomShow(false)}
>
<View style={{ marginBottom: '60rpx' }}>
<DateTimePicker
type="time"
onAnimationStart={onAnimationStart}
onAnimationEnd={onAnimationEnd}
value={popDomShow ? `${time.hour}:${time.minute}` : '-1:00'}
onConfirm={onSaveTiming}
onCancel={() => setShow(false)}
/>
</View>
</Popup>
</>
);
}
```
### 样式风格 `v2.3.7`
`activeStyle` 可以修改选中项的样式;`columnStyles` 可以设置每一列的样式;`fontStyles` 可以设置每一列文字的样式。
```jsx
import React, { useCallback } from 'react';
import { DateTimePicker } from '@ray-js/smart-ui';
import { showToast } from '@ray-js/ray';
export default function Demo() {
const onDateTimeInput = useCallback(event => {
const { detail } = event;
showToast({
icon: 'none',
title: new Date(detail).toLocaleString(),
});
}, []);
return (
<DateTimePicker
showToolbar={false}
type="datetime"
value={new Date(2018, 2, 31).getTime()}
columnStyles={{
year: {
background: 'rgba(0, 0, 0, 0.1)',
},
}}
fontStyles={{
month: {
color: 'rgb(23, 138, 237)',
},
}}
activeStyle={{
color: 'rgb(235, 87, 41)',
}}
onInput={onDateTimeInput}
/>
);
}
```
## API
### Props
| 参数 | 说明 | 类型 | 默认值 |
| ------------------- | ------------------------------------------------------------------------------ | -------------------------- | ---------- |
| cancelButtonText | 取消按钮文字 | _string_ | `取消` |
| confirmButtonText | 确认按钮文字 | _string_ | `确认` |
| itemHeight | 选项高度 | _number_ | `44` |
| loading | 是否显示加载状态 | _boolean_ | `false` |
| locale | 设置时间单位 | Locale | |
| maxDate | 可选的最大时间,精确到分钟 | _number_ | 十年后 |
| maxHour | 可选的最大小时,针对 time 类型 | _number_ | `23` |
| maxMinute | 可选的最大分钟,针对 time 类型 | _number_ | `59` |
| minDate | 可选的最小时间,精确到分钟 | _number_ | 十年前 |
| minHour | 可选的最小小时,针对 time 类型 | _number_ | `0` |
| minMinute | 可选的最小分钟,针对 time 类型 | _number_ | `0` |
| showToolbar | 是否显示顶部栏 | _boolean_ | `true` |
| title | 顶部栏标题 | _string_ | `''` |
| type | 类型,可选值为 `date` `time` `year-month` <br> <strong>不建议动态修改</strong> | _string_ | `datetime` |
| value | 当前选中值 | _string \| number \| Date_ | - |
| visibleItemCount | 可见的选项个数 | _number_ | `6` |
| formatterMap `v2.2.0` | 字符串替换(`type` 可选值为 `year`, `month`, `day`, `hour`, `minute`) | _Record<type, string \| Record<string, string>>_ | - |
| changeAnimation `v2.2.0` | 组件受数据驱动选择值改变时是否需要动画过度效果(不包含手指交互滚动的动画) | _boolean_ | `false` |
| is12HourClock `v2.6.0` | 当设置 `type: 'time'` 时,此属性可开启12小时选择模式 | _boolean_ | `false` |
| amText `v2.2.0` | 12小时选择模式时上午的文案 | _string_ | `AM` |
| pmText `v2.2.0` | 12小时选择模式时下午的文案 | _string_ | `PM` |
| columnsOrder `v2.2.0` | 设置列的顺序,同`flex order`属性,只是从样式角度修改列的顺序,逻辑还是不变 | _string[]_ | `[]` |
| animationTime `v2.3.7` | 过渡动画以及选择回调延迟的时间(单位ms) | _number_ | `800` `v2.3.7` `300` `v2.6.0` |
| columnStyles `v2.3.7` | 任意列的样式 | _Record\<string, string>_ | - |
| fontStyles `v2.3.7` | 任意列的字体样式 | _Record\<string, string>_ | - |
| activeStyle `v2.3.7` | 选中项的样式 | _React.CSSProperties_ | - |
### Events
| 事件名称 | 说明 | 回调参数 |
| ------------ | ------------------------ | ---------- |
| onCancel | 点击取消按钮时触发的事件 | - |
| onChange | 当值变化时触发的事件 | 组件实例 |
| onConfirm | 点击完成按钮时触发的事件 | 当前 value |
| onInput | 当值变化时触发的事件 | 当前 value |
| onAnimationStart `v2.3.2` | 组件内部动画开始 | - |
| onAnimationEnd `v2.3.2` | 组件内部动画结束 | - |
### change 事件
在`change`事件中,可以获取到组件实例,对组件进行相应的更新等操作:
| 函数 | 说明 |
| ------------------------------ | ------------------------------------------ |
| getColumnValue(index) | 获取对应列中选中的值 |
| getColumnValues(index) | 获取对应列中所有的备选值 |
| getValues() | 获取所有列中被选中的值,返回一个数组 |
| setColumnValue(index, value) | 设置对应列中选中的值 |
| setColumnValues(index, values) | 设置对应列中所有的备选值 |
| setValues(values) | `values`为一个数组,设置所有列中被选中的值 |
### 外部样式类
| 类名 | 说明 |
| ------------- | ------------ |
| activeClass | 选中项样式类 |
| columnClass | 列样式类 |
| toolbarClass | 顶部栏样式类 |
### Locale 结构
| 属性 | 说明 |
| ------ | -------- |
| day | 日单位 |
| hour | 小时单位 |
| minute | 分钟单位 |
| month | 月单位 |
| second | 秒单位 |
| year | 年单位 |
### 样式变量
其他CSS变量请参考 picker 组件文档说明 - 样式变量
组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](/material/smartui?comId=config-provider)。
| 名称 | 默认值 | 描述 |
| ----------------------------- | -------------------------------------- | ---- |
| --hairline-border-image-color `v2.6.0` | _var(--smart-ui-border-image, linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0)))_ | 分割线的 border-image 样式 |