<Link>
Примеры
<Link>
— это React-компонент, расширяющий HTML-элемент <a>
для обеспечения предварительной загрузки (prefetching) и клиентской навигации между маршрутами. Это основной способ навигации между маршрутами в Next.js.
import Link from 'next/link'
export default function Page() {
return <Link href="/dashboard">Dashboard</Link>
}
import Link from 'next/link'
export default function Page() {
return <Link href="/dashboard">Dashboard</Link>
}
Свойства (Props)
Вот сводка доступных свойств компонента Link:
Свойство | Пример | Тип | Обязательно |
---|---|---|---|
href | href="/dashboard" | String или Object | Да |
replace | replace={false} | Boolean | - |
scroll | scroll={false} | Boolean | - |
prefetch | prefetch={false} | Boolean | - |
Полезно знать: Атрибуты тега
<a>
, такие какclassName
илиtarget="_blank"
, можно передавать в<Link>
как свойства, и они будут переданы базовому элементу<a>
.
href
(обязательное)
Путь или URL для навигации.
<Link href="/dashboard">Dashboard</Link>
href
также может принимать объект, например:
// Переход на /about?name=test
<Link
href={{
pathname: '/about',
query: { name: 'test' },
}}
>
О нас
</Link>
replace
По умолчанию false
. При значении true
next/link
заменит текущее состояние истории вместо добавления нового URL в стек истории браузера.
import Link from 'next/link'
export default function Page() {
return (
<Link href="/dashboard" replace>
Dashboard
</Link>
)
}
import Link from 'next/link'
export default function Page() {
return (
<Link href="/dashboard" replace>
Dashboard
</Link>
)
}
scroll
По умолчанию true
. По умолчанию <Link>
прокручивает страницу к началу нового маршрута или сохраняет позицию прокрутки при навигации назад/вперёд. При значении false
next/link
не будет прокручивать страницу к началу после навигации.
import Link from 'next/link'
export default function Page() {
return (
<Link href="/dashboard" scroll={false}>
Dashboard
</Link>
)
}
import Link from 'next/link'
export default function Page() {
return (
<Link href="/dashboard" scroll={false}>
Dashboard
</Link>
)
}
prefetch
По умолчанию true
. При значении true
next/link
предварительно загрузит страницу (указанную в href
) в фоновом режиме. Это полезно для повышения производительности клиентской навигации. Любой <Link />
в области видимости (изначально или при прокрутке) будет предзагружен.
Предзагрузку можно отключить, передав prefetch={false}
. Предзагрузка работает только в production-режиме.
import Link from 'next/link'
export default function Page() {
return (
<Link href="/dashboard" prefetch={false}>
Dashboard
</Link>
)
}
import Link from 'next/link'
export default function Page() {
return (
<Link href="/dashboard" prefetch={false}>
Dashboard
</Link>
)
}
Примеры
Ссылки на динамические маршруты
Для динамических маршрутов удобно использовать шаблонные литералы для создания пути ссылки.
Например, можно сгенерировать список ссылок на динамический маршрут app/blog/[slug]/page.js
:
import Link from 'next/link'
function Page({ posts }) {
return (
<ul>
{posts.map((post) => (
<li key={post.id}>
<Link href={`/blog/${post.slug}`}>{post.title}</Link>
</li>
))}
</ul>
)
}
Middleware
Часто Middleware используется для аутентификации или других целей, связанных с перенаправлением пользователя на другую страницу. Чтобы компонент <Link />
правильно предзагружал ссылки с перезаписями через Middleware, необходимо указать Next.js как URL для отображения, так и URL для предзагрузки. Это нужно, чтобы избежать ненужных запросов к middleware для определения правильного маршрута предзагрузки.
Например, если вы хотите обслуживать маршрут /dashboard
с авторизованным и гостевым представлениями, можно добавить что-то подобное в Middleware для перенаправления пользователя на правильную страницу:
export function middleware(req) {
const nextUrl = req.nextUrl
if (nextUrl.pathname === '/dashboard') {
if (req.cookies.authToken) {
return NextResponse.rewrite(new URL('/auth/dashboard', req.url))
} else {
return NextResponse.rewrite(new URL('/public/dashboard', req.url))
}
}
}
В этом случае следует использовать следующий код в компоненте <Link />
:
import Link from 'next/link'
import useIsAuthed from './hooks/useIsAuthed'
export default function Page() {
const isAuthed = useIsAuthed()
const path = isAuthed ? '/auth/dashboard' : '/dashboard'
return (
<Link as="/dashboard" href={path}>
Dashboard
</Link>
)
}
История версий
Версия | Изменения |
---|---|
v13.0.0 | Больше не требует дочернего тега <a> . Предоставлен codemod для автоматического обновления кода. |
v10.0.0 | Свойства href , указывающие на динамический маршрут, автоматически разрешаются и больше не требуют свойства as . |
v8.0.0 | Улучшена производительность предзагрузки. |
v1.0.0 | Введён next/link . |