警告:道具 `id` 不匹配。服务器:"fc-dom-171" 客户端:"fc-dom-2" 在 Next.js 中使用 FullCalendar 时

Warning: Prop `id` did not match. Server: "fc-dom-171" Client: "fc-dom-2" when using FullCalendar in Next.js

上下文

我正在使用 FullCalendar v5.11.0NextJS v12.0.7React v17.0.2Typescript v4.3.5

我想创建一个基于 FullCalendar documentation 的简单日历,因此我创建了一个包含以下代码的 Calendar 组件:

import FullCalendar from '@fullcalendar/react';
import dayGridPlugin from '@fullcalendar/daygrid';
import Card from '../Card/Card';
import styles from './Calendar.module.scss';
import timeGridPlugin from '@fullcalendar/timegrid';
import interactionPlugin from '@fullcalendar/interaction';

type CalendarProps = {
  className?: string;
};

const Calendar = ({ className }: CalendarProps) => {
  return (
    <Card
      className={
        styles.calendarWrapper +
        (className !== undefined ? ' ' + className : '')
      }
    >
      <FullCalendar
        plugins={[dayGridPlugin, timeGridPlugin, interactionPlugin]}
        locale='fr'
        firstDay={1}
        headerToolbar={{
          start: 'prev next today',
          center: 'title',
          right: 'dayGridMonth,timeGridWeek,timeGridDay',
        }}
        businessHours={{
          // days of week. an array of zero-based day of week integers (0=Sunday)
          daysOfWeek: [1, 2, 3, 4, 5], // Monday - Thursday

          startTime: '7:00', // a start time
          endTime: '23:00', // an end time
        }}
        nowIndicator={true}
        selectable={true}
        selectMirror={true}
        weekNumbers={true}
        weekNumberFormat={{ week: 'numeric' }}
        initialView='dayGridMonth'
        eventColor='var(--sw-color-accent-300)'
        eventTextColor='var(--sw-color-primary-900)'
      />
    </Card>
  );
};

export default Calendar;

我的问题

在我检查 console.log 的地方,我可以看到错误:

Warning: Prop `id` did not match. Server: "fc-dom-1" Client: "fc-dom-2"

See more info here: https://nextjs.org/docs/messages/react-hydration-error

我做了研究,我发现我们可以使用动态导入和 Next.js 来禁用组件的 SSR,但经过一些尝试后我无法理解动态导入是如何工作的。

这是我开始尝试的代码,但没有找到使其工作的方法:

const FullCalendarWithNoSSR = dynamic(
  () => import('@fullcalendar/react').then((mod: any) => mod.FullCalendar),
  { ssr: false }
);

我得到的错误是:

Error: Please import the top-level fullcalendar lib before attempting to import a plugin.

我是 Next.js 和 FullCalendar 的新手,所以我可能误解了一些东西,尤其是关于动态导入。有人知道我做错了什么或如何通过 Next.js 正确使用 FullCalendar 吗?

您可以动态导入您的自定义 Calendar 组件,无论它在哪里使用。这确保所有 @fullcalendar 依赖项都动态导入到 client-side.

import dynamic from 'next/dynamic';
const Calendar = dynamic(() => import('../components/Calendar/Calendar'), {
    ssr: false
});

export default function IndexPage() {
    return (
        <Calendar />
    );
}

您还应该确保您没有在代码中的任何其他地方导入 @fullcalendar,因为这仍可能触发错误。

Codesandbox:https://codesandbox.io/s/fullcalendar-next-js-31hu2p