如果不是正在查看的月份,如何防止显示 FullCalendar 事件流事件?

How to prevent FullCalendar event stream events from being displayed if they are not for the month being viewed?

我在 FullCalendar 5 中使用月份显示。查看这个月时,会显示四月的最后几天以及六月的前几天。

我的问题是,当 FullCalendar 发送开始和结束日期时,它会发送显示日期的开始和结束日期,例如 4 月 28 日至 6 月 5 日,然后显示事件,包括之前的事件显示月份和下个月的天数。

有什么方法可以使用此示例将显示限制为 5 月的事件吗?

我在文档中遇到的最有前途的选项是 eventClassNamesEvent Render Hooks. Following the link there to the docs about className Inputs 下给出了如何使用它的更好示例。

简而言之,我们可以指定一个 eventClassNames 回调函数,它可以在每个事件呈现时选择性地向每个事件添加 class 名称。回调接收一个参数,该参数是一个对象,其中包含有关当前视图和正在呈现的事件的各种数据。稍微 console.dir()ing 让我们看看它的样子。

从那里,我们可以检查事件是否是当前显示月份的 before/after 和 start/end,如果是,添加一个 CSS class它。我选择了 hidden 但当然它可以是任何东西。请注意,您的 CSS 确实需要非常具体,以确保 class 覆盖 Fullcalendar 已经应用的其他内容。

let events = [
    {title: 'Event 1', start: '2022-05-01'},
    {title: 'Event 2', start: '2022-05-10'},
    {title: 'Event 3', start: '2022-05-31'},
    {title: 'Event 3', start: '2022-06-01'},
    {title: 'Event 4', start: '2022-06-04'},
];

document.addEventListener('DOMContentLoaded', function() {
    var calendarEl = document.getElementById('calendar');
    var calendar = new FullCalendar.Calendar(calendarEl, {
        initialView: 'dayGridMonth',
        events: events,
        eventClassNames: function(arg) {
            // console.dir(arg);
            let eventStart = arg.event.start;
            let monthStart = arg.view.currentStart;
            let monthEnd = arg.view.currentEnd;
            return (eventStart < monthStart || eventStart >= monthEnd)
                ? 'hidden'
                : '';
        }
    });
    calendar.render();
});
/* Needs to be quite specific to make sure it overrides other styles */
a.fc-daygrid-event.hidden {
    display: none;
}
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@5.11.0/main.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fullcalendar@5.11.0/main.min.css">

<div id='calendar'></div>