Обработка двух макетов в одном динамическом маршруте

#reactjs #next.js

Вопрос:

У меня около 8 категорий страниц подробностей, половина из которых-страницы подробностей, другая половина-страницы редакций. Данные для этих 2 типов страниц совершенно разные, и вложение одного маршрута во вложенную папку не является вариантом.

 pages/[detailPageCategory]/[slug].js
pages/[editorialPageCategory]/[slug].js
 

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

 pages/[pageType]/[slug].js
 

Будет ли лучшей идеей обрабатывать оба маршрута в одном динамическом маршруте? Это кажется нечистым, так как обе страницы связаны вместе, и мне нужно будет передать опору на страницу pageType={layout1|layout2} и обработать оба случая в компоненте страницы, не разделяя проблемы.

 const DynamicRoutePage = ({ pageType, data }) => {
  if (pageType === "detail") {
    return (
      <DetailPage {...data} />
    )
  }
  if (pageType === "editorial") {
    return (
      <EditorialPage {...data} />
    )
  }
  return null
}
 

Существуют ли лучшие методы, как подойти к этому? Возможно, следующая функция «getLayout»?

Ответ №1:

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

На реальных страницах вы можете [динамический импорт][1], основанный на типе страницы.

Так что шаблон страницы будет разделен на разные куски, и он не будет загружен сразу.

 const DetailPage = dynamic(() => import('../containers/DetailPage'))
const EditorialPage = dynamic(() => import('../containers/EditorialPage'))

const DynamicRoutePage = ({ pageType, data }) => {
  if (pageType === "detail") {
    return (
      <DetailPage {...data} />
    )
  }
  if (pageType === "editorial") {
    return (
      <EditorialPage {...data} />
    )
  }
  return null
}
 

Комментарии:

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

2. Для этого нет альтернативы, вот как работает nextjs. Вот почему они удалили большинство функций маршрутизации и предоставили доступ только к структуре страниц