Next.js перехват всех / как маршрутизация

#javascript #url #routes #next.js #catch-all

Вопрос:

Прежде всего, приношу извинения, если это немного сбивает с толку. Это потому, что я тоже в замешательстве.
Я довольно новичок в Next.js и я переношу сайт с Гэтсби, используя WP в качестве безголовой CMS. Я не создавал исходный сайт, поэтому я наследую кучу кода, с которым я не знаком.

Я использую /pages/listing/[slug].js компонент для создания индивидуальных списков для этого клиента. Я выбираю пути , запрашивая у всех слизней их списки getStaticPaths и используя слизни для запроса базы данных, чтобы получить данные для страницы getStaticProps . Пока все хорошо. Единственная проблема сейчас в том, что мне сказали, что клиент хочет сохранить свои URL — адреса в том виде, в каком они есть в настоящее время-например listing/experience/location/product-name-here (где product-name-here пуля, которую я извлек из CMS), но я только понял, как это сделать listing/product-name-here .

Мои неудачные подходы до сих пор заключались в том, чтобы:

  • Измените компонент на [...slug].js , но меня ругают за то, что пуля не является массивом. Даже если я изменю его в массив вручную при извлечении статических путей, поскольку извлекается только пуля, я все равно не использую правильный URL-адрес.
  • Используйте as опору на Link компоненте. Он отправляет меня по ссылке, которую я хочу сейчас, но я получаю ошибку 500. Если я введу URL вручную, используя href реквизит (т. Е. listing/product-name-here ), страница загружается правильно, но с неправильным URL-адресом.

Я задавался вопросом, есть ли какой-то способ получить доступ к URL-адресу, но единственное, с чем я столкнулся до сих пор useRouter , это то, что, поскольку это крючок, я не могу использовать его вне самого компонента.

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

Редактировать Проблема в конечном итоге была решена , fallback установив значение true и установив чертовски много дополнительных цепочек для всего, что связано с обработкой данных, связанных с API, а также пустые значения по умолчанию для всех реквизитов. Мое внутреннее чутье все еще подсказывает, что это не правильный «Следующий» способ справиться с этим, но проект был перенесен из Гэтсби и вроде как включен, так что мне просто нужно было заставить его работать.

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

1. Вам нужно создать файл: ./pages/listing/experience/location/[slug].js , в основном каталоги внутри каталога. Пожалуйста, обратитесь к: Вложенные маршруты

2. @brc-dd спасибо за комментарий, но это не то, к чему я стремлюсь. Я действительно нашел способ получить пути из CMS и getStaticPaths получаю массив значений для создания маршрута для всего улова [...slug].js , но getStaticProps не вижу params.slug , как он передается ему. Поэтому я не могу запросить в базе данных содержимое нужной мне страницы.

Ответ №1:

Отредактировано, так как первый ответ не работал.

Используйте pages/listing/[...slug].js в качестве имени файла, а затем возвращайте из getStaticPaths объекта, подобного этому:

   return {
    paths: [
      { params: { slug: ["path1"] } },
      { params: { slug: ["path2"] } },
      { params: { slug: ["deeper", "path"] } }
    ],
    fallback: false
  };
 

Это означает, что работают следующие адреса:

  • список/путь 1
  • список/путь 2
  • список/глубже/путь

Затем вы можете получить доступ к пуле в виде массива getStaticProps из контекста context.params.slug . Это будет содержать ["path1"] , ["path2"] или ["deeper", "path"] в зависимости от посещенной страницы.

Вы можете попробовать это в песочнице ниже:

https://codesandbox.io/s/confident-microservice-lu2jl?file=/pages/listing/[…slug].js

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

1. Я взглянул на это, но я думаю, что это может относиться к router объекту с useRouter крючка. Путь отображается в массиве in getStaticPaths , но getStaticProps просто не вызывается. Я видел билет от команды поддержки Vercel , в котором говорится, что ложные значения не передаются getStaticProps , но я проверил передаваемый объект paths, и это определенно правда. Если вы можете предоставить более подробную информацию, я был бы признателен.

2. Мои извинения, ответ был неправильным, я сделал рабочий codesandbox и написал ответ снова.

3. Спасибо, что уделили мне время. В итоге я удалил все вызовы getStaticProps и отрисовал что-либо сложное на странице, и оказалось, что массив можно было передать getStaticProps . Однако, похоже, проблема в том, что вызовы api возвращают неопределенные, а затем возвращают данные. Таким образом, приложение сразу же видит неопределенность и выдает ошибку вместо получения необходимой ему информации. Сталкивались ли вы с этой проблемой и будет ли ее использование Promise.all эффективным?

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

5. Я думаю, что, возможно, я столкнулся с решением для получения сначала неопределенных, а затем данных. Прочитайте эту вещь о резервном свойстве, если оно имеет значение true, оно работает так, если оно имеет значение блокировка, то оно будет ждать данных с первой попытки: nextjs.org/docs/basic-features/…