自定义页面日历图
本案例来自三方开发者「李睿」
1. 使用场景
本例介绍一下在宜搭自定义页面中如何实现日历效果。
2. 实现功能
2.1. 创建自定义页面
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691980120490-16706aa2-6ec8-4cc4-841a-20ad946f3033.png)
2.2. 数据源配置
(1)点击数据源按钮,配置变量
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691980236467-9bf82ff5-720a-4f32-9a44-5920bca1e3b8.png)
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691980264417-d8b3cc37-15e7-4207-9662-fe47d3fbb73e.png)
this.utils.formatter('date',Date.now(),'YYYY-M-D')
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691980465680-9e4c0d3b-699a-40c0-9587-8bc0ef6bd11e.png)
new Date().getFullYear()
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691980610600-c38cf259-297f-4008-8e3f-fd931473d4b2.png)
new Date().getMonth() + 1
2.3. 变量绑定
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691980859301-4a1f3924-4133-494e-bf26-bdea65404eb4.png)
state.year !== new Date().getFullYear() || state.month !== new Date().getMonth() + 1 || state.clickValue !== this.utils.formatter('date',Date.now(),'YYYY-M-D') ? 'NORMAL' : 'DISABLED'
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691980813437-b7c33f26-cb2c-4495-987b-d6a805cb0a05.png)
`${state.year}年${state.month}月`
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691981880508-916b6736-b819-4e1f-b2aa-e6748acc92fe.png)
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691981996311-a63f02de-be31-406e-ab0e-77b9b2cd1233.png)
`${item.type} ${item.dateString === state.clickValue? 'isChecked' : ''}`
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691982066340-7ab6233f-d688-4de1-85ce-8e1179e0b628.png)
2.4. 事件绑定
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691982362214-9e975bb0-cccb-41fb-a917-c19a9349d917.png)
export function didMount() {
this.renderCalendar();
}
// 日历渲染
export function renderCalendar() {
const { year, month } = this.state;
// 获取当前月第一天星期数
const nowMonthStartDayWeekNum = new Date(year, month - 1, 1).getDay();
// 获取当前月最后一天星期数
const nowMonthEndDayWeekNum = new Date(year, month, 0).getDay();
// 获取当前月最后一天天数
const nowMonthEndDayNum = new Date(year, month, 0).getDate();
// 获取上个月最后一天天数
const lastMonthEndDayNum = new Date(year, month - 1, 0).getDate();
const lastMonthDateList = _.range(lastMonthEndDayNum - nowMonthStartDayWeekNum + 1, lastMonthEndDayNum + 1, 1).map((item) => {
return {
type: 'lastMonth',
isToday: false,
year: month - 1 > 0 ? year : year - 1,
month: month - 1 > 0 ? month - 1 : 12,
day: item,
dateString: `${month - 1 > 0 ? year : year - 1}-${month - 1 > 0 ? month - 1 : 12}-${item}`,
};
}); // 上月日期序列
const nowMonthDateList = _.range(1, nowMonthEndDayNum + 1, 1).map((item) => {
return {
type: 'nowMonth',
isToday: item === new Date().getDate() && month === new Date().getMonth() + 1 && year === new Date().getFullYear(),
year,
month,
day: item,
dateString: `${year}-${month}-${item}`,
};
}); // 本月日期序列
const nextMonthDateList = _.range(1, 7 - nowMonthEndDayWeekNum, 1).map((item) => {
return {
type: 'nextMonth',
isToday: false,
year: month - 1 < 13 ? year : year + 1,
month: month + 1 < 13 ? month + 1 : 1,
day: item,
dateString: `${month - 1 < 13 ? year : year + 1}-${month + 1 < 13 ? month + 1 : 1}-${item}`,
};
}); // 下月日期序列
this.setState({
calendarDateList: [...lastMonthDateList, ...nowMonthDateList, ...nextMonthDateList],
});
}
// 切换年月
export function changeYearOrMonth() {
const { type } = this.params;
const { year, month } = this.state;
switch (type) {
case 'lastYear':
this.setState({
year: year - 1,
});
break;
case 'nextYear':
this.setState({
year: +year + 1,
});
break;
case 'lastMonth':
this.setState({
month: month - 1 > 0 ? month - 1 : 12,
year: month - 1 > 0 ? year : year - 1,
});
break;
case 'nextMonth':
this.setState({
month: +month + 1 < 13 ? +month + 1 : 1,
year: +month + 1 < 13 ? year : +year + 1,
});
break;
case 'nowMonth':
this.setState({
month: new Date().getMonth() + 1,
year: new Date().getFullYear(),
clickValue: this.utils.formatter('date', Date.now(), 'YYYY-M-D'),
});
break;
default:
console.log('无效的状态');
break;
}
this.renderCalendar();
}
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691982535634-5f8a7960-6582-4513-9de5-0240a091f567.png)
// 点击日历
export function onCalendarCellClick() {
console.log(this.item);
this.setState({
clickValue: this.item.dateString,
});
}
3. 实现效果
![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1691982625036-73206023-3929-4ea2-b172-9c7a9ac99a14.png)
4. 在线试玩
本文档对您是否有帮助?