Предупреждение: Prop `id` не совпадает. Сервер: «fc-dom-171» Клиент: «fc-dom-2» при использовании FullCalendar в Next.js

Контекст

Я использую FullCalendar v5.11.0, NextJS v12.0.7, React v17.0.2 и Typescript v4.3.5.

Я хотел создать простой календарь на основе Документация FullCalendar, поэтому я создал компонент 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.info, я вижу эту ошибку:

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, поэтому, вероятно, я что-то неправильно понимаю, особенно в отношении динамического импорта. Кто-нибудь знает, что я делаю неправильно или как правильно использовать FullCalendar с Next.js?

Это неправильный синтаксис для импорта next/dynamic с именованным экспортом. См. Как использовать динамический импорт с именованным экспортом в Next.js?.

juliomalves 07.05.2022 01:00

Спасибо за ответ, я пытался использовать этот код: 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. (я обновил свой пост, чтобы вы могли видеть код более читабельным)

R. Boutte 09.05.2022 17:00

Я бы посоветовал вам вместо этого динамически импортировать свой пользовательский компонент Calendar, где бы он ни использовался.

juliomalves 09.05.2022 17:11

Я только что попробовал это сейчас, но у меня все еще та же ошибка: Warning: Prop `id` did not match. Server: "fc-dom-2" Client: "fc-dom-6"

R. Boutte 09.05.2022 17:20

Вот codeandbox, который воспроизводит проблему, извините за поздний ответ: codeandbox.io/s/…

R. Boutte 10.05.2022 10:37

У меня работает динамический импорт ../components/Calendar/Calendar.tsx на главной странице. Как я уже сказал, вместо этого вы захотите динамически импортировать свой собственный компонент Calendar.

juliomalves 10.05.2022 11:46

Не могли бы вы поделиться ссылкой на свое решение (например, песочницу) или разместить код здесь? Потому что, когда я пытался, это не сработало, поэтому, возможно, я делал что-то не так... Я использовал динамический импорт в своем компоненте календаря, но тоже получил ошибку, так что да, если вы можете поделиться своим решением, я был бы признателен

R. Boutte 10.05.2022 11:58

Конечно, вот модифицированная версия вашей песочницы: codeandbox.io/s/fullcalendar-next-js-31hu2p.

juliomalves 10.05.2022 12:01

Боже мой, я чувствую себя таким глупым, я совершенно забыл, что у меня был другой календарь, созданный в другом компоненте, поэтому у меня все еще была проблема на той же странице после динамического импорта моего компонента календаря, поэтому я динамически импортировал другой компонент, который я сделал, и проблема теперь решена! Большое спасибо за вашу помощь, не стесняйтесь публиковать ответ на ответ, чтобы я мог установить его как решение!

R. Boutte 10.05.2022 12:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
9
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо этого вы можете динамически импортировать свой собственный компонент Calendar, где бы он ни использовался. Это гарантирует, что все зависимости @fullcalendar динамически импортируются на стороне клиента.

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

Другие вопросы по теме

Похожие вопросы