Динамическая маршрутизация в Next.js работает очень интуитивно с помощью файловой системы. Чтобы создать динамическую страницу для постов по id, вам нужно следовать определенной структуре папок и имен файлов.
На момент моего знания (Cut-off date: 2023), в Next.js 14 принцип динамической маршрутизации не изменился с предыдущих версий.
1. Структура папок
В вашем проекте Next.js создайте папку `pages`, если она уже не создана.
2. Динамические маршруты
Внутри `pages`, создайте файл с именем в квадратных скобках, чтобы указать динамический параметр маршрута. Например:
```
pages/
[id].tsx
```
Этот файл будет отвечать за обработку маршрута вроде `/1`, `/2`, `/3` и так далее.
3. Получение параметра внутри компонента
Внутри файла `[id].tsx` используйте `useRouter` из `next/router` для получения параметра `id` из URL.
Вот пример компонента:
```tsx
import { useRouter } from 'next/router';
const Post = () => {
const router = useRouter();
const { id } = router.query; // Получаем 'id' из маршрута
return (
<div>
<h1>Post: {id}</h1>
{/* Отобразить информацию о посте здесь */}
</div>
);
};
export default Post;
```
4. Использование Link для навигации
В вашем главном компоненте `page.tsx`, используйте компонент `Link` из `next/link` для создания ссылок на динамические страницы. Пример ниже показывает, как это делается правильно:
```tsx
import Link from 'next/link';
const HomePage = ({ posts }) => {
return (
<div>
{/* Предположим, что 'posts' - это массив объектов постов, каждый из которых имеет 'id' */}
{posts.map((post) => (
<div key={post.id}>
<h2>{post.title}</h2>
<Link href={`/posts/${post.id}`}>
<a>Читать далее</a>
</Link>
</div>
))}
</div>
);
};
export default HomePage;
```
Обратите внимание, что я заменил `href` в `Link` с `/[id]` на `/posts/[id]`, так как использование префикса `posts` кажется более семантически правильным. Если вы хотите, чтобы ваши URL были именно в виде `"/1", "/2", "/3"`, то тогда ваш код должен работать правильно (по предоставленной вами информации).
Если вы все еще сталкиваетесь с ошибкой `404`, убедитесь, что:
- Компонент `Link` используется правильно.
- У вас нет опечаток в именах папок и файлах.
- Ваш Next.js сервер был перезапущен (если вы только что создали файлы и папки).
- Страницы динамически импортируются, если используются нестандартные пути; в Next.js 14 их нужно импортировать в `_app.tsx` или `pages.tsx`, чтобы они корректно отображались на роутах.
Если вы делаете все правильно, но ошибка непонятно почему происходит, попробуйте проверить консоль разработч