---
nav:
path: /components
group:
title: 信息展示
order: 8
toc: 'content'
---
# Calendar 日历
日历组件
## 代码示例
## API
以下为日历组件的属性及描述:
| 属性 | 说明 | 类型 | 默认值 |
| ------------- | ---------------------------------------------- | ----------------------------------------------------------- | ----------- |
| defaultValue | 初始值 | CalendarValue | 无 |
| value | 日历选择的日期,传入后即为受控模式 | CalendarValue | 无 |
| selectionMode | 设置选择模式,单选或者连续区间,默认为 `range` | `single` \| `range` | `range` |
| monthRange | 月份范围,默认为最近 3 个月 | `[number, number]` | 最近 3 个月 |
| weekStartsOn | 星期栏,以周几作为第一天显示。默认为 `Sunday` | `Sunday` \| `Monday` | `Sunday` |
| onChange | 日期变化回调 | (date: CalendarValue) => void | 无 |
| onFormatter | 用于设置单元格的自定义数据 | (cell: CellState, currentValue: CalendarValue) => CellState | 无 |
| localeText | 国际化文案 | Partial`` | 无 |
### 类型
**CalendarValue** : 日历的值类型,为数字或数字元组 `number | [number,number]`,表示单选或连续日期区间。单位为毫秒的时间戳。
**CellState** : 定义了日历单元格的各种状态。
```typescript
interface CellState {
/**
* 是否禁用
*/
disabled: boolean;
/**
* 日历单元格的顶部内容
*/
top?: { label: string; className?: string };
/**
* 日历单元格的底部内容
*/
bottom?: { label: string; className?: string };
/**
* 时间戳
*/
time: number;
/**
* 日期
*/
date: number;
/**
* 是否选中
*/
isSelected: boolean;
}
```
**LocaleText** : 提供国际化支持的文案结构。
```typescript
interface LocaleText {
/**
* 星期的名称,从周一至周日
* 默认为 ['一', '二', '三', '四', '五', '六', '日']
*/
weekdayNames: string[];
/**
* 月份标题的格式,默认为 'YYYY年MM月'
*/
title: string;
/**
* 今天的文案,默认为 '今日'
*/
today: string;
/**
* 开始的文案,默认为 '开始'
*/
start: string;
/**
* 结束的文案,默认为 '结束'
*/
end: string;
/**
* 开始与结束的文案,默认为 '开始/结束'
*/
startAndEnd: string;
}
```
## FAQ
### 如何设置默认的开始与结束时间?
通过 `defaultValue` 可以设置默认的时间。`defaultValue` 的类型是 `CalendarValue`。
`CalendarValue` 的类型是 `number | [number, number]`,代表单选或者连续区间的日期。它是一个时间戳,单位是毫秒。
例如,如果我们想设置默认的开始时间为今天,结束时间为七天后,我们可以在 `defaultValue` 中传入以下代码:
```ts
[dayjs().startOf('date'), dayjs().add(7, 'days').startOf('date')];
```
### 通过 `onFormatter` 设置单元格的自定义数据
我们可以通过 `onFormatter` 方法设置单元格的自定义数据,`onFormatter` 的格式是 `(cell: CellState, currentValue: CalendarValue) => CellState`。
这个函数会获取每个单元格的状态以及当前的值。通过返回新的单元格数据,我们可以自定义单元格的状态。
以下是一些常见的使用场景:
#### 如何让当天之前的时间不可选?
在支付宝小程序中,我们可以通过页面上的方法设置,需要在 axml 文件中传入一个方法名字符串。
axml 文件:
```xml
```
ts 文件:
```ts
import dayjs from 'dayjs';
Page({
handleFormat(cell: CellState) {
// 如果单元格代表的时间早于今天的开始时间,则禁止选择
return {
disabled: dayjs(cell.time).isBefore(dayjs().startOf('date')),
};
},
});
```
在微信小程序,我们也可以通过 data 中的函数来设置,此时在 wxml 文件中需要传入一个变量名。
wxml 文件:
```xml
```
ts 文件:
```ts
import dayjs from 'dayjs';
Page({
data: {
handleFormat: (cell: CellState) => {
// 如果单元格代表的时间早于今天的开始时间,则禁止选择
return {
disabled: dayjs(cell.time).isBefore(dayjs().startOf('date')),
};
},
},
});
```