Calendar 3.0.0
日历组件,基于groupList组件实现。
可通过以下两种方式定义日期范围:
- 传入具体的起、始日期。
- 传入距离系统当日的间隔天数,默认90。入住时间在离店时间之后,则互换。默认selectionStart、selectionEnd可选择同一天。
- 默认不能选择今天之前的日期。同时,如果
selectionStart
时间在今天之前,会被重置为今天。 可以通过allowSelectionBeforeToday
属性来严格按照duration
渲染,消除默认场景。
引用方式
import { Calendar } from '$yo-component';
// 如果你的项目中未使用最新的 ykit-config-yo 插件,可能无法使用上面这个语法糖
// 你仍然可以通过下面这种方式来引用
import Calendar from 'yo3/component/calendar';
基本用法
最简单用法,默认显示未来 90 天的可选日期范围,同时选中日期范围的起、始日期可为同一天。
用户选中范围的起始日期分别是 selectionStart
和 selectionEnd
属性。由于这是一个受控组件,所以需要通过 onChange
回调来设置当前值。
<Calendar
selectionStart={this.state.selectionStart}
selectionEnd={this.state.selectionEnd}
onChange={obj => this.setState({
selectionStart: obj.selectionStart,
selectionEnd: obj.selectionEnd
})}
/>
显示特定日期范围
使用 duration
属性,配置显示特定阶段的日期范围,传入具体的数值显示未来可选择的天数范围,还可传入一个数组,显示特定起始范围的可选日期。
另外,可以在 onChange
函数中决定用户选择的日期范围的起、始日期不能为同一天。
class Demo extends Component {
constructor() {
super();
this.state = {
selectionStart: '2017-01-01',
selectionEnd: '2017-01-10'
};
}
onChange(obj) {
const { selectionStart, selectionEnd } = obj;
if (selectionStart === selectionEnd) {
return;
}
this.setState({
selectionStart,
selectionEnd
});
}
render() {
return (
<Calendar
duration={['2017-01-01', '2017-12-31']}
selectionStart={this.state.selectionStart}
selectionEnd={this.state.selectionEnd}
onChange={obj => this.onChange(obj)}
/>
);
}
}
只允许选择单日
配置 allowSingle
属性为 true
,只允许用户选择单个日期,即仅有 selectionStart
属性生效。
<Calendar
allowSingle={true}
selectionStart={this.state.selectionStart}
onChange={obj => this.setState({
selectionStart: obj.selectionStart,
})}
/>
个性化选中日期标记
通过设置 selectionStartText
和 selectionEndText
属性自定义选中日期的标记内容,同时可传入Yo支持的iconfont。
另外,可以在 onChange
函数中动态设置 selectionStartText
的文字内容,在用户前后两次选中同一天和选择一个日期范围两种情况之间的标记切换。
<Calendar
selectionStart={this.state.selectionStart}
selectionEnd={this.state.selectionEnd}
selectionStartText="起飞"
selectionEndText=""
onChange={obj => this.onChange(obj)}
/>
自定义日期渲染模板
通过设置 renderDate
属性函数,返回自定义组件的日期渲染模板内容。其中,参数 item
是具体某个日期对象的数据层,格式如下:
{
date: “2017/10”, // 年/月
day: 1, // 日
disabled: false, // 是否可点击
holiday: "国庆节", // 节假日
isCheck: false, // 是否选中
isCheckIn: false, // 是否选中的开始日期
isCheckOut: false, // 是否选中的结束日期
lunar: '08-12', // 农历日期:八月十二
today: false, // 是否今天
weekend: true, // 是否周末
}
另外,可通过参数 ret
获取组件内部的默认渲染模板:
[
<span className="day">{item.day}</span>,
item.today ? (<ins className="special">今天</ins>) : null,
item.holiday ? (<ins className="special">{item.holiday}</ins>) : null,
item.isCheckIn ? (<span className="tip yo-ico">{selectionStartText}</span>) : null,
item.isCheckOut ? (<span className="tip yo-ico">{selectionEndText}</span>) : null
]
<Calendar
renderDate={(item, ret) => {
const { day } = item;
return day === 1 ? (
<span>First</span>
) : ret;
}
/>
duration { Number/Array } #
允许用户选择的日期范围,支持两种形式:传入数字,则表示从今天开始到N天后;传入形式为['yyyy-mm-dd','yyyy-mm-dd']的数组, 可以直接设置起始日期和终止日期。
默认值: 90
extraClass { String } #
组件的额外样式
selectionStart { String } #
默认选中范围的开始日期
selectionEnd { String } #
默认选中范围的结束日期
selectionStartText { String } #
选中范围的开始日期标注,可传入文字或yo支持的icofont
默认值: '入店'
selectionEndText { String } #
选中范围的结束日期标注,可传入文字或yo支持的icofont
allowSingle { Bool } #
是否只允许选中单个日期
默认值: false
allowSelectionBeforeToday { Bool } 3.0.9 #
是否严格根据 duration
属性渲染,支持选择今天之前的日期
默认值: false
onChange { Function } #
点击选中日期时回调函数
方法参数:
参数名 | 类型 | 描述 | 支持版本 |
---|---|---|---|
obj | Object | 选中范围的开始日期、结束日期对象 | |
obj.selectionStart | String | 选中范围的开始日期 | |
obj.selectionEnd | String | 选中范围的结束日期 |
renderDate { Function } #
每个日期对象渲染函数的模板。可自定义单个日期节点的显示内容。
默认值: () => {}
方法参数:
参数名 | 类型 | 描述 | 支持版本 |
---|---|---|---|
item | Object | 待渲染的日期数据对象 | |
ret | String | 组件默认的日期渲染模板 |