Как в Next.js 13 реализовать страницу-дубликат, используя наиболее эффективное решение?

Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
Изображение к вопросу
  • 26 августа 2023 г. 8:36
Ответы на вопрос 1
В Next.js 13 вы можете реализовать страницу-дубликат, используя динамические маршруты. Вместо создания точной копии папок и кода, вы можете создать одну общую компоненту, которая будет использоваться как шаблон для обеих страниц.

Примерный подход к реализации таких страниц будет следующим:

1. Создайте компонент с общей структурой и стилями, который будет использоваться как шаблон для обеих страниц. Этот компонент может называться, например, `LessonPageTemplate`.

2. Создайте компоненты `LessonPage` и `MaterialPage`, которые будут служить точками входа для соответствующих страниц.

3. Используя динамический маршрут Next.js, вы можете передать параметр (например, `slug`) в URL для определения, какую страницу открыть. Для этого вам понадобится создать файл с именем `[slug].js` или `[slug].tsx` внутри папки `pages`, где `slug` представляет собой переменную, которую вы будете использовать для определения отображаемой страницы.

Вот пример кода, который может помочь понять процесс:

1. Создайте компонент `LessonPageTemplate`.

```jsx
import styles from "./LessonPageTemplate.module.css";

export default function LessonPageTemplate({ title, content }) {
  return (
    <div className={styles.container}>
      <h1>{title}</h1>
      <div className={styles.content}>{content}</div>
    </div>
  );
}
```

2. Создайте компоненты `LessonPage` и `MaterialPage`.

```jsx
import LessonPageTemplate from "../components/LessonPageTemplate";

export default function LessonPage() {
  const title = "Lesson Page";
  const content = "Lesson Page Content";

  return <LessonPageTemplate title={title} content={content} />;
}
```

```jsx
import LessonPageTemplate from "../components/LessonPageTemplate";

export default function MaterialPage() {
  const title = "Material Page";
  const content = "Material Page Content";

  return <LessonPageTemplate title={title} content={content} />;
}
```

3. Создайте динамический маршрут `[slug].js` или `[slug].tsx` для обработки обоих страниц.

```jsx
import { useRouter } from "next/router";
import LessonPage from "./LessonPage";
import MaterialPage from "./MaterialPage";

export default function Page() {
  const router = useRouter();
  const { slug } = router.query;

  // Определите, какую страницу отобразить на основе slug
  if (slug === "lesson") {
    return <LessonPage />;
  } else if (slug === "material") {
    return <MaterialPage />;
  }

  return null;
}
```

Теперь, если вы откроете `/lesson` в браузере, будет отображаться страница `LessonPage`, а если вы откроете `/material`, будет отображаться страница `MaterialPage`.

Представленное решение позволяет избежать дублирования кода и структуры папок и предоставляет наиболее эффективное решение для создания двух независимых страниц с одинаковой структурой на Next.js 13 с использованием App Router.
Похожие вопросы