3 - Вложенный роутинг и динамические страницы в Next.js, хук useParams

Для доступа к видео войдите в систему

3 - Вложенный роутинг и динамические страницы в Next.js, хук useParams

Оценить качество материала и подачу материала автором видео:

Front-end

Трудоустройтесь middle front-end разработчиком на React JS (TypeScript) за 12-16 месяцев обучения с ежедневной менторской поддержкой в формате видео 1 на 1 и коммерческими проектами в портфолио

Перейти на курс
Front-end

Back-end

Трудоустройтесь middle back-end разработчиком за 12-16 месяцев обучения с ежедневной менторской поддержкой в формате видео 1 на 1 и коммерческими проектами в портфолио

Перейти на курс
Back-end

Карьерный бустер

Получите коммерческий опыт на реальных стартапах, прокачайте tech & soft навыки, научитесь работать в команде, проходить собеседования и получите первую работу в IT!

Перейти на курс
Карьерный бустер

Основы Front-end

Сделайте первый шаг в IT, освоив базовые знания разработки и научившись создавать небольшие проекты на JavaScript

Перейти на курс
Основы Front-end

Основы Back-end

Сделайте первый шаг в IT, освоив базовые знания разработки. Без опыта. Без математики. Только практика: JavaScript, SQL, Node JS, база данных

Перейти на курс
Основы Back-end

Роутинг в Next.js: Динамические страницы и хук useParams | App Router на практике

Автор конспекта: Стогниева Виктория

📚 Введение: Маршрутизация на основе файловой системы

В Next.js создание страниц и навигация между ними — фундаментальная часть фреймворка, которая работает "из коробки". В отличие от традиционного подхода в React, здесь не требуются внешние библиотеки, такие как react-router-dom.

Система маршрутизации построена на простой и интуитивной идее: структура папок в директории app напрямую определяет URL-адреса приложения.

1. Основы: Создание статической страницы

Создание базовой страницы в Next.js подчиняется одному простому и элегантному правилу.

1.1. 🛠 Пошаговое руководство

Рассмотрим процесс создания страницы, доступной по адресу /apple:

  1. Создайте папку: Внутри директории app создайте новую папку. Ее название станет URL-сегментом.
  • Пример: app/apple
  1. Создайте файл компонента: Внутри только что созданной папки (apple) создайте файл с обязательным именем page.tsx. Этот файл будет определять пользовательский интерфейс (UI) вашей страницы.
  • Пример: app/apple/page.tsx
  1. Экспортируйте компонент по умолчанию: В файле page.tsx напишите стандартный React-компонент и экспортируйте его по умолчанию (export default). Обратите внимание: название самой функции-компонента (например, ApplePage) не имеет значения для маршрутизации, важен именно export default.

1.2. 🔧 Минимальный код для page.tsx

Вот минимально необходимый код для файла app/apple/page.tsx:

page.tsx
import styles from "../page.module.css"
 
export default function Home() {
  return (
    <div className={styles.page}>
      <main className={styles.main}>APPLE PAGE</main>
    </div>
  )
}
💡

Ключевой вывод: Название папки определяет URL-адрес, а файл page.tsx внутри нее — содержимое этой страницы. Теперь, когда мы умеем создавать одиночные страницы, давайте рассмотрим, как создавать вложенные маршруты.

2. Вложенные маршруты 📂

Next.js позволяет легко создавать более сложные URL-структуры, такие как /apple/orange, просто вкладывая папки друг в друга.

2.1. Принцип вложенности

Здесь все так же интуитивно: вложение папок в директории app напрямую создает вложенные URL-адреса в браузере.

2.2. Пример структуры 🗂️

Для создания страницы по адресу /apple/orange структура папок будет выглядеть следующим образом:

      • page.tsx
        • page.tsx
  • 💡

    Ключевой вывод: Структура папок в вашем проекте точно отражает структуру URL в адресной строке браузера.

    3. Динамические маршруты: Страницы для уникальных данных 🌀

    Статические страницы отлично подходят для разделов вроде "О нас" или "Контакты". Но что делать, если вашему приложению нужно отображать тысячи страниц товаров или профилей пользователей? Создавать их вручную невозможно. Здесь на помощь приходит самая мощная возможность маршрутизатора Next.jsдинамические маршруты.

    3.1. Проблема: Масштабирование 📈

    Представьте, что вам нужно создать страницу профиля для каждого пользователя вашего приложения. Создавать вручную папки /profile/1, /profile/2, /profile/3 и так далее — невозможно и неэффективно. Именно для таких задач и существуют динамические маршруты. Они позволяют создать один шаблон страницы, который будет отображать уникальные данные в зависимости от URL.

    3.2. Решение: Синтаксис квадратных скобок [] 🔄

    Чтобы создать динамический сегмент URL, нужно назвать папку, обернув ее имя в квадратные скобки. Это превращает имя папки в параметр.

    • Пример: Папка с именем app/profile/[id] будет обрабатывать любые адреса, соответствующие этому шаблону: /profile/1, /profile/27, /profile/user-abc и так далее. Часть URL, соответствующая [id], становится динамическим параметром.

    Примечание: Название внутри скобок (в данном случае id) является произвольным. Вы можете использовать [slug], [userId] или любое другое имя, которое описывает передаваемый параметр. Это имя вы будете использовать для доступа к его значению внутри компонента.

    3.3. Как получить динамический параметр внутри компонента 🔍

    Чтобы получить значение из URL (например, 27 из адреса /profile/27) внутри компонента, нужно выполнить следующие шаги:

    Шаг 1: Хук useParams В Next.js для чтения параметров из URL используется специальный хук useParams, который импортируется из next/navigation.

    Шаг 2: Директива 'use client' Это критически важный момент. Хуки, такие как useState, useEffect и useParams, а также обработчики событий (onClick) работают только в клиентских компонентах. По умолчанию все компоненты в app являются серверными. Чтобы превратить компонент в клиентский, необходимо добавить директиву 'use client' в самое начало файла page.tsx.

    Почему это важно? Потому что параметры URL (такие как ID пользователя) существуют и могут быть прочитаны только в браузере пользователя (на клиенте), а не на сервере во время первоначальной сборки страницы.

    Шаг 3: Пример кода Вот как выглядит файл app/profile/[id]/page.tsx, который получает и отображает ID пользователя из URL:

    tsx
    // 1. Обязательная директива для использования хуков.
    // Превращает компонент из серверного (по умолчанию) в клиентский.
    "use client"
     
    import { useParams } from "next/navigation"
     
    export default function Home() {
      // 2. Вызываем хук, чтобы получить доступ к динамическим параметрам URL.
      // Для URL /profile/123, params будет { id: '123' }
      const params = useParams()
     
      return (
        <div className={styles.page}>
          <main className={styles.main}>Profile {params.slug}</main>
        </div>
      )
    }

    Обратитесь к параметру по имени, которое вы указали в квадратных скобках (params.slug). Если бы папка называлась [userId], то обращаться нужно было бы к params.userId.

    3.4. Серверные vs. Клиентские компоненты: Важное различие ⚙️

    Тип компонентаОписаниеКогда использовать 'use client'
    Серверный (по умолчанию) 🖥️Рендерится на сервере. Быстрый, безопасный, имеет прямой доступ к серверным ресурсам (например, к БД).Не используется.
    Клиентский 🌐Рендерится на клиенте (в браузере). Позволяет использовать интерактивность.Обязательно для использования хуков (useState, useEffect, useParams) и обработчиков событий (onClick, onChange).

    Владение этими тремя типами маршрутизации является основой для создания любого приложения на Next.js.

    4. Итоги: Шпаргалка по маршрутизации 📋

    Эта таблица объединяет все ключевые концепции маршрутизации в Next.js (App Router).

    Тип маршрутаСтруктура папок (Пример)Ключевая особенность
    Статический 📍app/about/page.tsxОдна папка — один конкретный URL (/about).
    Вложенный 📂app/dashboard/settings/page.tsxВложенные папки создают вложенные URL (/dashboard/settings).
    Динамический 🌀app/users/[id]/page.tsxПапка в [] создает шаблон для множества URL (/users/1, /users/2 и т.д.). Требует useParams и 'use client'.