Я использую 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?
Спасибо за ответ, я пытался использовать этот код: 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.
(я обновил свой пост, чтобы вы могли видеть код более читабельным)
Я бы посоветовал вам вместо этого динамически импортировать свой пользовательский компонент Calendar
, где бы он ни использовался.
Я только что попробовал это сейчас, но у меня все еще та же ошибка: Warning: Prop `id` did not match. Server: "fc-dom-2" Client: "fc-dom-6"
Вот codeandbox, который воспроизводит проблему, извините за поздний ответ: codeandbox.io/s/…
У меня работает динамический импорт ../components/Calendar/Calendar.tsx
на главной странице. Как я уже сказал, вместо этого вы захотите динамически импортировать свой собственный компонент Calendar
.
Не могли бы вы поделиться ссылкой на свое решение (например, песочницу) или разместить код здесь? Потому что, когда я пытался, это не сработало, поэтому, возможно, я делал что-то не так... Я использовал динамический импорт в своем компоненте календаря, но тоже получил ошибку, так что да, если вы можете поделиться своим решением, я был бы признателен
Конечно, вот модифицированная версия вашей песочницы: codeandbox.io/s/fullcalendar-next-js-31hu2p.
Боже мой, я чувствую себя таким глупым, я совершенно забыл, что у меня был другой календарь, созданный в другом компоненте, поэтому у меня все еще была проблема на той же странице после динамического импорта моего компонента календаря, поэтому я динамически импортировал другой компонент, который я сделал, и проблема теперь решена! Большое спасибо за вашу помощь, не стесняйтесь публиковать ответ на ответ, чтобы я мог установить его как решение!
Вместо этого вы можете динамически импортировать свой собственный компонент 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
Это неправильный синтаксис для импорта
next/dynamic
с именованным экспортом. См. Как использовать динамический импорт с именованным экспортом в Next.js?.