You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FullCalendar设置状态后自动跳转至今日日期问题咨询

FullCalendar自动滚动回今日问题排查与解决方案

问题核心

配置visibleRange实现2年视图时,hover事件触发setShow(true)状态更新,日历无理由自动滚动回当前日期(08-29),移除visibleRange则问题消失,但无法保留2年视图需求。

解决方案

1. 隔离状态更新的重渲染范围

setShow(true)可能触发了日历组件的整体重渲染,导致FullCalendar重新计算视图并滚动回今日。将事件hover的逻辑封装到独立的记忆化组件中,避免触发日历容器的重渲染:

const EventItem = React.memo(({ event, onHover }) => {
  return <div onMouseEnter={onHover} className="fc-event">{event.title}</div>;
});

// 使用时绑定稳定的回调
const handleEventHover = useCallback(() => {
  setShow(true);
}, [setShow]);

// 日历事件渲染配置
eventContent: (info) => {
  return <EventItem event={info.event} onHover={handleEventHover} />;
}

2. 手动保存并恢复滚动位置

在状态更新前后手动记录、恢复日历的滚动偏移,绕过自动滚动的逻辑:

const calendarRef = useRef(null);

const handleHover = () => {
  // 记录当前滚动位置
  const { top, left } = calendarRef.current.getScroll();
  // 更新状态
  setShow(true);
  // 微任务队列中恢复滚动,避免重渲染覆盖
  queueMicrotask(() => {
    calendarRef.current.scrollTo({ top, left });
  });
};

// 绑定日历ref
<FullCalendar ref={calendarRef} visibleRange={your2YearRange} ... />

3. 固定visibleRange的计算逻辑

如果visibleRange是动态基于当前日期计算的,状态更新时可能导致范围重新评估,触发滚动。提前计算固定的2年区间,避免动态依赖:

// 在组件外部或初始化时计算固定范围,避免每次渲染重新计算
const TWO_YEAR_RANGE = {
  start: new Date(new Date().getFullYear(), 0, 1),
  end: new Date(new Date().getFullYear() + 2, 0, 1)
};

// 日历配置中直接使用固定值
visibleRange: TWO_YEAR_RANGE

4. 关闭日历的自动滚动默认行为

部分FullCalendar版本在重渲染时会自动滚动到当前日期,通过配置关闭该行为:

// 日历配置项中添加
scrollTimeReset: false,
nowIndicator: false // 若不需要今日指示器,可关闭进一步减少干扰

内容的提问来源于stack exchange,提问作者newstacker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:51:06