Русский

Изучите параллельные маршруты Next.js: всеобъемлющее руководство по созданию динамических и гибких макетов страниц с несколькими независимыми разделами. Узнайте о реализации, преимуществах и лучших практиках.

Параллельные маршруты Next.js: создание динамических макетов страниц

Next.js, ведущий фреймворк React, постоянно развивается, чтобы предоставить разработчикам мощные инструменты для создания современных веб-приложений. Одна из самых интересных функций, представленных в последних версиях, — это параллельные маршруты. Эта функция позволяет отображать несколько независимых разделов в одном и том же макете страницы, предлагая беспрецедентную гибкость и контроль над структурой и пользовательским опытом вашего приложения.

Что такое параллельные маршруты?

Традиционно маршрут в Next.js соответствует одному компоненту страницы. При переходе к другому маршруту вся страница перерисовывается. Параллельные маршруты нарушают эту парадигму, позволяя отображать несколько компонентов одновременно в одном и том же макете, каждый из которых управляется собственным независимым сегментом маршрута. Представьте себе, что вы делите страницу на отдельные разделы, каждый со своим URL-адресом и жизненным циклом, все они сосуществуют на одном экране.

Это открывает множество возможностей для создания более сложных и динамичных пользовательских интерфейсов. Например, вы можете использовать параллельные маршруты для:

Понимание концепции: слоты

Основная концепция, лежащая в основе параллельных маршрутов, — это понятие «слотов». Слот — это именованная область в вашем макете, где отображается определенный сегмент маршрута. Вы определяете эти слоты в своем каталоге app, используя символ @, за которым следует имя слота. Например, @sidebar представляет слот с именем «sidebar».

Затем каждый слот можно связать с сегментом маршрута. Когда пользователь переходит к определенному маршруту, Next.js отобразит компонент, связанный с этим сегментом маршрута, в соответствующем слоте в макете.

Реализация: практический пример

Давайте проиллюстрируем, как работают параллельные маршруты, на практическом примере. Представьте, что вы создаете приложение для электронной коммерции и хотите отобразить страницу с информацией о продукте с постоянно отображаемой боковой панелью корзины покупок.

1. Структура каталогов

Во-первых, давайте определим структуру каталогов для нашего приложения:

app/
  product/
    [id]/
      @cart/
        page.js  // Компонент корзины покупок
      page.js      // Компонент с информацией о продукте
    layout.js   // Макет продукта
  layout.js     // Корневой макет

Вот что представляет каждый файл:

2. Корневой макет (app/layout.js)

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

// app/layout.js
export default function RootLayout({ children }) {
  return (
    
      
        
Мое приложение электронной коммерции
{children}
© 2024
); }

3. Макет продукта (app/product/[id]/layout.js)

Это важная часть, где мы определяем наши слоты. Мы получаем компоненты для основной страницы продукта и корзины в качестве свойств, соответствующих page.js и @cart/page.js соответственно.

// app/product/[id]/layout.js
export default function ProductLayout({ children, cart }) {
  return (
    
{children}
); }

В этом примере мы используем простой макет flexbox для позиционирования основного контента продукта и боковой панели корзины рядом друг с другом. Свойство children будет содержать отображаемый вывод из app/product/[id]/page.js, а свойство cart будет содержать отображаемый вывод из app/product/[id]/@cart/page.js.

4. Страница с информацией о продукте (app/product/[id]/page.js)

Это стандартная страница динамического маршрута, которая отображает информацию о продукте на основе параметра id.

// app/product/[id]/page.js
export default async function ProductDetails({ params }) {
  const { id } = params;
  // Получить данные о продукте на основе ID
  const product = await fetchProduct(id);

  return (
    

Информация о продукте

{product.name}

{product.description}

Цена: ${product.price}

); } async function fetchProduct(id) { // Замените на вашу фактическую логику получения данных return new Promise(resolve => setTimeout(() => { resolve({ id, name: `Product ${id}`, description: `Description of Product ${id}`, price: 99.99 }); }, 500)); }

5. Компонент корзины покупок (app/product/[id]/@cart/page.js)

Этот компонент представляет собой корзину покупок, которая будет отображаться в слоте @cart.

// app/product/[id]/@cart/page.js
export default function ShoppingCart() {
  return (
    

Корзина покупок

Товаров в корзине: 3

); }

Пояснение

Когда пользователь переходит на страницу /product/123, Next.js выполнит следующее:

  1. Отобразит корневой макет (app/layout.js).
  2. Отобразит макет продукта (app/product/[id]/layout.js).
  3. Внутри макета продукта отобразит компонент с информацией о продукте (app/product/[id]/page.js) в свойство children.
  4. Одновременно отобразит компонент корзины покупок (app/product/[id]/@cart/page.js) в свойство cart.

В результате получается страница с информацией о продукте с постоянно отображаемой боковой панелью корзины покупок, все отображается в одном макете.

Преимущества использования параллельных маршрутов

Рекомендации и лучшие практики

Расширенное использование: условный рендеринг и динамические слоты

Параллельные маршруты не ограничиваются статическими определениями слотов. Вы также можете использовать условный рендеринг и динамические слоты для создания еще более гибких макетов.

Условный рендеринг

Вы можете условно отображать разные компоненты в слоте в зависимости от ролей пользователей, статуса аутентификации или других факторов.

// app/product/[id]/layout.js
import { getUserRole } from '../../utils/auth';

export default async function ProductLayout({ children, cart }) {
  const userRole = await getUserRole();

  return (
    
{children}
); } function AdminPanel() { return (

Админ-панель

Управляйте информацией о продукте здесь.

); }

В этом примере, если у пользователя роль «admin», компонент AdminPanel будет отображаться в слоте @cart вместо корзины покупок.

Динамические слоты

Хотя это менее распространено, теоретически вы *можете* создавать имена слотов динамически, но это обычно не рекомендуется из-за сложности и потенциальных последствий для производительности. Лучше придерживаться предопределенных и хорошо понятных слотов. Если возникает необходимость в динамических «слотах», рассмотрите альтернативные решения, такие как использование стандартных компонентов React со свойствами и условным рендерингом.

Примеры из реальной жизни и варианты использования

Давайте рассмотрим некоторые примеры из реальной жизни использования параллельных маршрутов в различных типах приложений:

Заключение

Параллельные маршруты Next.js — это мощная функция, которая открывает новый мир возможностей для создания динамичных и гибких веб-приложений. Позволяя отображать несколько независимых разделов в одном и том же макете страницы, параллельные маршруты позволяют создавать более привлекательный пользовательский опыт, повышать повторное использование кода и упрощать процесс разработки. Хотя важно учитывать потенциальные сложности и следовать лучшим практикам, овладение параллельными маршрутами может значительно улучшить ваши навыки разработки Next.js и позволит вам создавать действительно инновационные веб-приложения.

Поскольку Next.js продолжает развиваться, параллельные маршруты, несомненно, станут все более важным инструментом для разработчиков, стремящихся расширить границы возможного в Интернете. Поэкспериментируйте с концепциями, изложенными в этом руководстве, и узнайте, как параллельные маршруты могут преобразовать ваш подход к созданию современных веб-приложений.