#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
крючка. Путь отображается в массиве ingetStaticPaths
, ноgetStaticProps
просто не вызывается. Я видел билет от команды поддержки Vercel , в котором говорится, что ложные значения не передаютсяgetStaticProps
, но я проверил передаваемый объект paths, и это определенно правда. Если вы можете предоставить более подробную информацию, я был бы признателен.2. Мои извинения, ответ был неправильным, я сделал рабочий codesandbox и написал ответ снова.
3. Спасибо, что уделили мне время. В итоге я удалил все вызовы
getStaticProps
и отрисовал что-либо сложное на странице, и оказалось, что массив можно было передатьgetStaticProps
. Однако, похоже, проблема в том, что вызовы api возвращают неопределенные, а затем возвращают данные. Таким образом, приложение сразу же видит неопределенность и выдает ошибку вместо получения необходимой ему информации. Сталкивались ли вы с этой проблемой и будет ли ее использованиеPromise.all
эффективным?4. Похоже, вам понадобится некоторая логика, чтобы показать счетчик, например, во время загрузки? Вы можете проверить, не определено ли оно в начале вашей функции визуализации, и показать некоторый загружаемый текст или счетчик, пока данные не будут доступны.
5. Я думаю, что, возможно, я столкнулся с решением для получения сначала неопределенных, а затем данных. Прочитайте эту вещь о резервном свойстве, если оно имеет значение true, оно работает так, если оно имеет значение блокировка, то оно будет ждать данных с первой попытки: nextjs.org/docs/basic-features/…