众所周知,我最近在找工作,然后就遇到了一道面试题(需要面试题和简历一起提交)。具体要求如下:
看着这些需求,鉴于我有限的审美能力,我决定还是抄借鉴一个吧。所以目光锁定了ios的系统日程表,审美在线。
这里暂时就定为2个页面和一个弹窗
这里的日历计算方式,就是先拿到我们的月份,然后获取第一天。因为日历显示的是周日开始,所以根据第一天是周几,然后向前减去几天。
// date 为当前需要计算的日期
const dateObj = dayjs(date);
const monthStart = dateObj.startOf("month");
const dayOfWeek = monthStart.day();
const fistDay = monthStart.subtract(dayOfWeek, "day");
这样我们就拿到了日历的开始第一天的日期。然后进行遍历,一般情况下,日历显示42天,开始不足的部分由上月补足,结尾不足的部分由下月补足。补足的部分要用灰色显示。
// 需要生成一个6*7的数组
const days: CurrentDate[][] = new Array(6).fill(0).map(() => []);
for (let i = 0; i < 42; i++) {
const currentDate = fistDay.add(i, "day");
// 每7天即添加到下一个数组
days[Math.floor(i / 7)].push({
date: currentDate,
showDate: currentDate.date(),
formatDate: currentDate.format("YYYY-MM-DD"),
isCurrtentMonth: currentDate.month() === dateObj.month(),
isToday: currentDate.isSame(dayjs(), "day"),
});
}
整体的数据结构如下
export type CurrentDate = {
date: dayjs.Dayjs; // 当前时间的原始时间
showDate: number; // 显示在日历中的1-31
isCurrtentMonth?: boolean; //是否为当月
isToday: boolean; // 是否为今天
formatDate: string; // 年月日的完整展示,这里用来跟后面的是否有日程做比对,如果有会在日历中展示一个小红点
};
渲染数据,并做如下判断:
核心的pinia store,包括以下几个state
list根据日期来进行分类
整体结构为
{
"2024-05-15": {
"10:00-12:00": [
{
title: "Meeting",
startTime: "10:00",
date: "2024-04-15",
endTime: "12:00",
remark: "Discuss the plan for the next quarter",
},
{
title: "Interview",
startTime: "10:00",
endTime: "12:00",
date: "2024-04-15",
remark: "Interview candidate for the front-end position",
},
],
}
这里根据日期对整体做一个初步的map,然后根据每个日程的时间范围,做二次map,这样相同高度的日程就可以聚合在一起,而不同时间的日程,就可以显示在不同的位置。
每组数据,跟日常中的相关字段对应
根据list进行遍历,对于具体日程,根据"开始时间-结束时间"这个key进行具体的划分。然后计算出当前这个时间段的高度,以及相对于顶部的位置。
const dateList = computed(() => {
const { list, day } = store
const dayText = dayjs(day).format('YYYY-MM-DD')
const dateList = list[dayText] // 获取当天日程信息
return Object.keys(dateList).map(key => {
const item = dateList[key]
const [startHour, endHour] = key.split('-') //开始时间结束时间拆分
return {
list: item,
top: getTop(startHour) + '%', //顶部top
height: (getTop(endHour) - getTop(startHour)) + '%' 时间差的高度
}
})
})
function getTop(time, isEnd = false) {
const [hour, minute] = time.split(':')
const top = (hour * 60 + minute * 1) / 1440 * 100 // 根据时和分,转化后,除以24小时的时间,算出百分比
return top
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。