У меня есть простая настройка для динамической маршрутизации с использованием Next 13. Вот мои настройки файла. У меня также есть компонент с массивом объектов. Моя цель — сопоставить массив и показать динамические данные на странице [slug] page.jsx. Aka /lion должен показывать данные для льва.
Мой вопрос: как получить правильный параметр или идентификатор для отображения правильных данных на динамическом маршруте?
//Within the [slug] page.jsx
{animals.map((animal, index) => (
<div key = {index}>
<Link href = {animal.Link}>
<p>Name: {animal.Name}</p>
<p>Info: {animal.Info}</p>
</Link>
</div>
))}





В Next.js 13 динамическая маршрутизация немного отличается от предыдущих версий. Вместо использования подхода маршрутизации на основе файлов Next.js 13 представил новый способ обработки динамических маршрутов с использованием модулей next/link и next/router.
import { useRouter } from 'next/router';
import Link from 'next/link';
const SlugPage = () => {
const router = useRouter();
const { slug } = router.query; // Access the slug parameter from the router
// Assuming you have an array of animals
const animals = [
{ Name: 'Lion', Info: 'The king of the jungle', Link: '/lion' },
{ Name: 'Tiger', Info: 'A majestic big cat', Link: '/tiger' },
// Other animal objects
];
// Filter the array based on the current slug
const filteredAnimals = animals.filter(
(animal) => animal.Link === `/${slug}`
);
return (
<div>
{filteredAnimals.map((animal, index) => (
<div key = {index}>
<Link href = {animal.Link}>
<a>
<p>Name: {animal.Name}</p>
<p>Info: {animal.Info}</p>
</a>
</Link>
</div>
))}
</div>
);
};
export default SlugPage;
Я обновил код в соответствии с Next 13, дайте мне знать, сработало это или нет.
С помощью Next 13 вы можете получить параметры с помощью крючка useSearchParams, предоставленного рядом, для поиска по параметрам.
useSearchParams— это хук клиентского компонента, который позволяет вам прочитать строку запроса текущего URL.useSearchParamsвозвращает доступную только для чтения версию URLSearchParams inter
пример:
'use client'
import { useSearchParams } from 'next/navigation'
export default function SearchBar() {
const searchParams = useSearchParams()
const search = searchParams.get('search')
// URL -> `/dashboard?search=my-project`
// `search` -> 'my-project'
return <>Search: {search}</>
}
Обратите внимание, что useSearchParams — это хук клиентского компонента, поэтому вы должны быть в контексте клиентского компонента, который вам может понадобиться включить 'use client' в начало вашего файла.
Большое спасибо! Основная причина, по которой я работаю с Next.js, заключается в его преимуществах SEO. Можно ли добиться этого без использования «использовать клиент»?
это не противоречит преимуществам SEO, некоторые компоненты должны работать на стороне клиента, если вы хотите использовать хуки, которые вы хотите просто получать данные на сервере.
@AndrewLeonardi, так как вы хотите показывать ссылки с помощью <Link>, вы должны быть в контексте клиентского компонента.
Я смог решить это. В приведенном ниже коде метод find ищет объект животного, где свойство Link соответствует значению /animals/${params.slug}.
Вот пример объекта в массиве:
{
"Name": "Lion",
"Info": "Lions live to be 15 years old.",
"Link": "/animals/lion"
},
И вот как я динамически нахожу животное:
import { animals } from '@/components/AnimalData';
export default function Animals({ params }) {
const animal = animals.find(animal => animal.Link === `/animals/${params.slug}`);
return (
<div>
{animal ? (
<div>
<p>Animal: {animal.Name}</p>
<p>Info: {animal.Info}</p>
</div>
) : (
<p>Animal not found</p>
)}
</div>
);
}
Большое спасибо, что нашли время, чтобы помочь. Кажется, в Next 13 все немного изменилось. Я получаю эту ошибку: у вас есть серверный компонент, который импортирует next/router. Вместо этого используйте следующий/навигация.