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

react-big-calendar点击日/周/月视图仅高亮不切换问题求助

React-Big-Calendar视图切换异常问题修复(Next.js + Tailwind环境)

在Next.js 13.5.4 + Tailwind项目中使用react-big-calendar@1.6.8时,出现视图切换异常:默认视图为month,点击week或day选项仅会高亮选中项,但日历的显示结构完全没有变化。

问题截图

月视图初始状态
点击周视图后仅高亮选项但视图未切换

相关代码

组件代码(Schedules.tsx)

"use client";

import React, { useState } from "react";
import {
  Calendar as BigCalendar,
  CalendarProps,
  momentLocalizer,
} from "react-big-calendar";
import moment from "moment";

const localizer = momentLocalizer(moment);

const Schedules = (props: Omit<CalendarProps, "localizer">) => {
  const [isDialogOpen, setDialogOpen] = useState(false);

  //Dates
  const today = new Date();
  const minDate = new Date(
    today.getFullYear(),
    today.getMonth(),
    today.getDate(),
    8
  );
  const maxDate = new Date(
    today.getFullYear(),
    today.getMonth(),
    today.getDate(),
    17
  );

  return (
    <div className="max-container padding-container h-[calc(100vh-15vh)] ">
      <BigCalendar
        className="p-4 shadow-2xl rounded-lg bg-slate-50 border-2 border-gray-20"
        selectable
        localizer={localizer}
        views={['day','week','month']}
        min={minDate}
        max={maxDate}
        onSelectSlot={() => {
          const modal = document.getElementById("my_modal_4") as HTMLDialogElement;
          if (modal) {
            modal.show();
          }}}
      />
      <dialog id="my_modal_4" className="modal">
        <div className="modal-box h-full w-full max-w-5xl">
          <h3 className="font-bold text-lg">Hello!</h3>
          <p className="py-4">Click the button below to close</p>
          <div className="modal-action">
            <form method="dialog">
              <button className="btn">Close</button>
            </form>
          </div>
        </div>
      </dialog>
    </div>
  );
};

export default Schedules;

package.json配置

{
  "name": "sched",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "@emotion/react": "^11.11.1",
    "@emotion/styled": "^11.11.0",
    "@mui/lab": "^5.0.0-alpha.148",
    "@mui/material": "^5.14.13",
    "@types/react-big-calendar": "^1.8.0",
    "class-variance-authority": "^0.7.0",
    "clsx": "^2.0.0",
    "moment": "^2.29.4",
    "next": "13.5.4",
    "react": "^18",
    "react-big-calendar": "^1.6.8",
    "react-dom": "^18",
    "tailwind-merge": "^1.14.0",
    "tailwindcss-animate": "^1.0.7"
  },
  "devDependencies": {
    "@types/node": "^20",
    "@types/react": "^18",
    "@types/react-dom": "^18",
    "autoprefixer": "^10",
    "postcss": "^8",
    "tailwindcss": "^3",
    "typescript": "^5"
  }
}

修复方案

1. 引入react-big-calendar官方样式

react-big-calendar的不同视图结构依赖官方提供的CSS样式,缺少样式会导致视图切换后无法正常渲染。在组件顶部添加样式引入:

import 'react-big-calendar/lib/css/react-big-calendar.css';

2. 用受控模式管理视图状态

在Next.js客户端组件环境中,react-big-calendar的非受控视图状态可能无法触发组件重渲染,需要手动维护视图状态:

  • 添加视图状态变量
  • 绑定view属性和onViewChange回调

修改后的核心代码片段:

// ...其他导入
import 'react-big-calendar/lib/css/react-big-calendar.css';

const Schedules = (props: Omit<CalendarProps, "localizer">) => {
  // 新增:管理当前视图状态
  const [currentView, setCurrentView] = useState<'day' | 'week' | 'month'>('month');
  // ...其他状态

  return (
    <div className="max-container padding-container h-[calc(100vh-15vh)] ">
      <BigCalendar
        className="p-4 shadow-2xl rounded-lg bg-slate-50 border-2 border-gray-20"
        selectable
        localizer={localizer}
        views={['day','week','month']}
        // 绑定受控视图属性
        view={currentView}
        onViewChange={setCurrentView}
        min={minDate}
        max={maxDate}
        onSelectSlot={() => {
          const modal = document.getElementById("my_modal_4") as HTMLDialogElement;
          if (modal) {
            modal.show();
          }}}
      />
      // ...模态框代码
    </div>
  );
};

完成以上两步修改后,点击视图切换按钮时,日历会正确渲染对应视图的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:17:36