TimePicker 时间选择框
如果项目中使用的是 0.x 版本的基础组件(@icedesign/base, @ali/ice, @alife/next),请在左侧导航顶部切换组件版本。
安装方法
- 在命令行中执行以下命令
npm install @alifd/next@latest -S
Guide
何时使用
当用户需要输入一个时间,可以点击输入框,在弹出的时间选择面板上操作。时间选择面板仅支持 24 小时制。format
支持的时间格式如下:
格式 | 例子 | 说明 |
---|---|---|
H HH | 0..23 | 时,24 小时制 |
m mm | 0..59 | 分 |
s ss | 0..59 | 秒 |
组件默认使用 moment 实例作为输入输出值,推荐使用结合 moment 的方式使用组件。此外,组件也支持传入时间字符串的方式,例如直接传入 "12:00:00"。用户传入什么类型的 value/defaultValue 值,就会在 onChange 中返回相应的类型。
API
TimePicker
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
label | 按钮的文案 | ReactNode | - |
size | 时间选择框的尺寸可选值:'small', 'medium', 'large' | Enum | 'medium' |
state | 输入框状态可选值:'error', 'success' | Enum | - |
placeholder | 输入框提示 | String | - |
value | 时间值(moment 对象或时间字符串,受控状态使用) | custom | - |
defaultValue | 时间初值(moment 对象或时间字符串,非受控状态使用) | custom | - |
hasClear | 是否允许清空时间 | Boolean | true |
format | 时间的格式https://momentjs.com/docs/#/parsing/string-format/ | String | 'HH:mm:ss' |
hourStep | 小时选项步长 | Number | - |
minuteStep | 分钟选项步长 | Number | - |
secondStep | 秒钟选项步长 | Number | - |
disabledHours | 禁用小时函数签名:Function(index: Number) => Boolean参数:index: {Number} 时 0 - 23返回值:{Boolean} 是否禁用 | Function | - |
disabledMinutes | 禁用分钟函数签名:Function(index: Number) => Boolean参数:index: {Number} 分 0 - 59返回值:{Boolean} 是否禁用 | Function | - |
disabledSeconds | 禁用秒钟函数签名:Function(index: Number) => Boolean参数:index: {Number} 秒 0 - 59返回值:{Boolean} 是否禁用 | Function | - |
visible | 弹层是否显示(受控) | Boolean | - |
defaultVisible | 弹层默认是否显示(非受控) | Boolean | - |
popupContainer | 弹层容器签名:Function(target: Object) => ReactNode参数:target: {Object} 目标节点返回值:{ReactNode} 容器节点 | Function | - |
popupAlign | 弹层对齐方式, 详情见Overlay 文档 | String | 'tl tl' |
popupTriggerType | 弹层触发方式可选值:'click', 'hover' | Enum | 'click' |
onVisibleChange | 弹层展示状态变化时的回调签名:Function(visible: Boolean, type: String) => void参数:visible: {Boolean} 弹层是否隐藏和显示type: {String} 触发弹层显示和隐藏的来源 fromTrigger 表示由trigger的点击触发; docClick 表示由document的点击触发 | Function | func.noop |
popupStyle | 弹层自定义样式 | Object | - |
popupClassName | 弹层自定义样式类 | String | - |
popupProps | 弹层属性 | Object | - |
followTrigger | 是否跟随滚动 | Boolean | - |
disabled | 是否禁用 | Boolean | false |
onChange | 时间值改变时的回调签名:Function(value: Object/String) => void参数:value: {Object/String} 时间对象或时间字符串 | Function | func.noop |
ARIA and KeyBoard
按键 | 说明 |
---|---|
Enter | 打开时间选择框 |
Esc | 关闭时间选择框 |
Up | 输入上一秒的时间 (如果 disabledMinutes={true} 则可能是上一分钟或者上一小时) |
Down | 输入下一秒的时间 (如果 disabledMinutes={true} 则可能是下一分钟或者下一小时) |
Page Up | 输入上一分钟的时间 |
Page Down | 输入下一分钟的时间 |
Alt + Page Up | 输入上一小时的时间 |
Alt + Page Down | 输入下一小时的时间 |
代码示例
最简单的用法。
查看源码在线预览
import { TimePicker } from '@alifd/next';
ReactDOM.render(<TimePicker onChange={(val) => console.log(val)} />, mountNode);
可以通过 defaultValue
传入默认时间值,并且可以通过选择改变该值。onChange
回调参数的值的类型取决于 defaultValue
的类型。
查看源码在线预览
import { TimePicker } from '@alifd/next';
import moment from 'moment';
const defaultVal = moment('12:00:00', 'HH:mm:ss', true);
ReactDOM.render(<div>
<TimePicker defaultValue={defaultVal} onChange={(val) => console.log(val)} /><br /><br />
<TimePicker defaultValue="12:00:00" onChange={(val) => console.log(val)} />
</div>, mountNode);
TimePicker 使用和 Input 组件相同的输入框尺寸,可以通过 size
属性进行设置。
查看源码在线预览
import { TimePicker } from '@alifd/next';
ReactDOM.render(<div>
<TimePicker size="large" />
<TimePicker />
<TimePicker size="small" />
</div>, mountNode);
通过 value
和 onChange
实现受控,仅支持通过选择实现受控。
查看源码在线预览
import { TimePicker } from '@alifd/next';
import moment from 'moment';
class ControlledTimePicker extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
value: moment('12:00:00', 'HH:mm:ss', true)
};
}
onSelect = (value) => {
this.setState({ value });
this.props.onChange(value);
}
render() {
return <TimePicker value={this.state.value} onChange={this.onSelect} />;
}
}
ReactDOM.render(<ControlledTimePicker onChange={(val) => console.log(val.format('HH:mm:ss'))} />, mountNode);
禁用全部和禁用部分选择项
查看源码在线预览
import { TimePicker } from '@alifd/next';
const disabledHours = [1, 2, 3, 4, 5];
const disabledMinutes = [10, 20, 30, 40, 50];
const disabledSeconds = [10, 20, 30, 40, 50];
const disabledItems = (list) => (index) => {
return list.indexOf(index) >= 0;
};
ReactDOM.render(<div>
<p>Disable TimePicker</p>
<TimePicker disabled />
<p>Disable Hours/Minutes/Seconds</p>
<TimePicker disabledHours={disabledItems(disabledHours)} disabledMinutes={disabledItems(disabledMinutes)} disabledSeconds={disabledItems(disabledSeconds)} />
</div>, mountNode);
可以通过 format
属性格式化时间值,此外该属性还会影响到时间列的展示。
查看源码在线预览
import { TimePicker } from '@alifd/next';
ReactDOM.render(<div>
<p>Hide seconds</p>
<TimePicker format="HH:mm" />
<p>Hide hours</p>
<TimePicker format="mm:ss" />
</div>, mountNode);
可以通过 hourStep
, minuteStep
, secondStep
分别设置时分秒的选项间隔。
查看源码在线预览
import { TimePicker } from '@alifd/next';
ReactDOM.render(<TimePicker onChange={(val) => console.log(val.format('HH:mm:ss'))} hourStep={2} minuteStep={5} secondStep={5} />, mountNode);
配合 Field 使用
查看源码在线预览
import { TimePicker, Field, Button } from '@alifd/next';
import moment from 'moment';
class Demo extends React.Component {
field = new Field(this);
onClick = () => {
const value = this.field.getValue('time-picker');
console.log(value.format('HH:mm:ss'));
}
render() {
const { init } = this.field;
const props = init('time-picker', {
rules: [
{ required: true, message: 'Time Required' }
],
initValue: moment('00:00:00', 'HH:mm:ss', true)
});
return (<div>
<TimePicker {...props} /> <br /><br />
<Button onClick={this.onClick}>Print Value in Console</Button>
</div>);
}
}
ReactDOM.render(<Demo />, mountNode);