#reactjs #next.js #strapi
#reactjs #next.js #strapi
Вопрос:
В моем Next.js блог с помощью Strapi CMS, я пытаюсь сортировать сообщения на основе их категории. Я создал динамический маршрут для categories [id].js. Он использует getStaticPaths следующим образом:
export async function getStaticPaths() {
const categories = await getCategories()
return {
paths: categories.map((category) => `/categories/${category.id}`) || [],
fallback: false,
}
Я использую выпадающий список для фильтрации категорий.
Например, если я выберу категорию 1, путь будет выглядеть следующим образом http://localhost:3000/categories/1 .
Пока все в порядке.
Но выпадающий список по-прежнему отображается на странице, и когда я выбираю категорию 2. Теперь путь http://localhost:3000/categories/categories/2 что, конечно же, приводит к ошибке 404.
ожидаемый результат http://localhost:3000/categories/2
Компонент next / link, который я использую для выпадающих элементов, выглядит следующим образом:
<Link href="/categories/[id]" as={`/categories/${category.id}`}>
<a>{category.name}</a>
</Link>
Я знаю, что допустил какую-то ошибку, но не могу понять, что это такое.
Однако у меня есть [slug].js для сообщений, который также отображает больше сообщений. Это перенаправляет на соответствующие сообщения без добавления дополнительных /сообщений для пути. Но это не работает аналогичным образом для категорий. Пожалуйста, помогите.
Ответ №1:
Он должен возвращать id
только.
export async function getStaticPaths() {
const categories = await getCategories()
const paths = categories.map((category) => ({
params: { id: category.id.toString() },
}))
return {
paths,
fallback: false,
}
}
Комментарии:
1. Спасибо за ответ. Пробовал это, не сработало.
2. обновлен код.. пожалуйста, посмотрите, работает ли это .. это сработало для меня.
3. идентификатор должен быть string =>
params: { id: category.id.toString() }
4. Я не думаю, что это проблема. Если я введу правильный адрес вручную, отобразится требуемая страница. Просто добавляется дополнительный ` / categories` . кстати, попытался преобразовать его в строку. не сработало
Ответ №2:
Почему вы не используете parmas
свойство, как в этом примере? https://nextjs.org/docs/basic-features/data-fetching#getstaticpaths-static-generation
Комментарии:
1. Спасибо за ответ. Вы имеете в виду, как упоминал @Nilesh Patel? Это не сработало
2.
export async function getStaticProps({ params }) { const categories = await getCategories() const posts = await getPostByCategory(params.id) const category = posts[0]?.category.name.toString() || '' return { props: { posts, categories, category }, revalidate: 1, }; }
Ответ №3:
Я не уверен, что это правильный способ решить эту проблему, я просто добавил условие, чтобы проверить, есть ли уже /categories в имени пути. Если это так, я не добавляю /categories в ссылку href следующим образом:
<Link as={this.props.router.pathname.includes("categories") ? `${category.id}` : `categories/${category.id}`}
href={this.props.router.pathname.includes("categories") ? "[id]" : "categories/[id]"}>
<a>{category.name}</a>
</Link>
Пожалуйста, дайте мне знать, если есть какое-либо лучшее решение