Link
<Link>
ist eine React-Komponente, die das HTML-<a>
-Element erweitert, um Prefetching und clientseitige Navigation zwischen Routen zu ermöglichen. Es ist die primäre Methode, um zwischen Routen in Next.js zu navigieren.
Grundlegende Verwendung:
Referenz
Die folgenden Props können an die <Link>
-Komponente übergeben werden:
Prop | Beispiel | Typ | Erforderlich |
---|---|---|---|
href | href="/dashboard" | String oder Objekt | Ja |
replace | replace={false} | Boolean | - |
scroll | scroll={false} | Boolean | - |
prefetch | prefetch={false} | Boolean | - |
legacyBehavior | legacyBehavior={true} | Boolean | - |
passHref | passHref={true} | Boolean | - |
shallow | shallow={false} | Boolean | - |
locale | locale="fr" | String oder Boolean | - |
onNavigate | onNavigate={(e) => {}} | Funktion | - |
Gut zu wissen: Attribute des
<a>
-Tags wieclassName
odertarget="_blank"
können als Props an<Link>
übergeben werden und werden an das zugrunde liegende<a>
-Element weitergegeben.
href
(erforderlich)
Der Pfad oder die URL, zu der navigiert werden soll.
replace
Standardwert: false
. Wenn true
, ersetzt next/link
den aktuellen Verlaufseintrag, anstatt eine neue URL zum Browserverlauf hinzuzufügen.
scroll
Standardwert: true
. Das standardmäßige Scrollverhalten von <Link>
in Next.js ist die Beibehaltung der Scrollposition, ähnlich wie Browser mit der Navigation vor und zurück umgehen. Wenn Sie zu einer neuen Seite navigieren, bleibt die Scrollposition gleich, solange die Seite im Viewport sichtbar ist. Wenn die Seite jedoch nicht im Viewport sichtbar ist, scrollt Next.js zum obersten Element der Seite.
Wenn scroll = {false}
, versucht Next.js nicht, zum ersten Seitenelement zu scrollen.
Gut zu wissen: Next.js prüft
scroll: false
, bevor es das Scrollverhalten verwaltet. Wenn das Scrollen aktiviert ist, identifiziert es den relevanten DOM-Knoten für die Navigation und überprüft jedes Top-Level-Element. Alle nicht scrollbaren Elemente und solche ohne gerendertes HTML werden übersprungen, einschließlich Elementen mit fester oder sticky Positionierung und nicht sichtbaren Elementen, die mitgetBoundingClientRect
berechnet werden. Next.js durchläuft dann die Geschwisterelemente, bis es ein scrollbares Element findet, das im Viewport sichtbar ist.
prefetch
Das Prefetching erfolgt, wenn eine <Link />
-Komponente in den Viewport des Benutzers gelangt (initial oder durch Scrollen). Next.js lädt die verlinkte Route (angegeben durch href
) und die Daten im Hintergrund vor, um die Leistung der clientseitigen Navigation zu verbessern. Prefetching ist nur in der Produktion aktiviert.
Die folgenden Werte können an die prefetch
-Prop übergeben werden:
true
(Standard): Die vollständige Route und ihre Daten werden vorab geladen.false
: Prefetching erfolgt nicht beim Eintritt in den Viewport, aber beim Hover. Wenn Sie das Prefetching beim Hover vollständig deaktivieren möchten, sollten Sie ein<a>
-Tag verwenden oder inkrementell migrieren zum App-Router, der auch das Deaktivieren des Prefetchings beim Hover ermöglicht.
legacyBehavior
Warnung: Die
legacyBehavior
-Prop wird in Next.js v16 entfernt. Um das neue<Link>
-Verhalten zu übernehmen, entfernen Sie alle<a>
-Tags, die als Kinder von<Link>
verwendet werden. Ein Codemod ist verfügbar, um Ihnen bei der automatischen Aktualisierung Ihres Codebase zu helfen.
Seit Version 13 ist ein <a>
-Element nicht mehr als Kind der <Link>
-Komponente erforderlich. Wenn Sie das alte Verhalten aus Kompatibilitätsgründen dennoch benötigen, können Sie die legacyBehavior
-Prop hinzufügen.
Gut zu wissen: Wenn
legacyBehavior
nicht auftrue
gesetzt ist, können alleanchor
-Tag-Eigenschaften wieclassName
,onClick
usw. auch annext/link
übergeben werden.
passHref
Erzwingt, dass Link
die href
-Eigenschaft an sein Kind weitergibt. Standardwert ist false
. Siehe das Beispiel Übergeben einer funktionalen Komponente für weitere Informationen.
shallow
Aktualisiert den Pfad der aktuellen Seite, ohne getStaticProps
, getServerSideProps
oder getInitialProps
erneut auszuführen. Standardwert ist false
.
locale
Die aktive Locale wird automatisch vorangestellt. Mit locale
kann eine andere Locale angegeben werden. Wenn false
, muss href
die Locale enthalten, da das Standardverhalten deaktiviert ist.
onNavigate
Ein Event-Handler, der während der clientseitigen Navigation aufgerufen wird. Der Handler empfängt ein Event-Objekt, das eine preventDefault()
-Methode enthält, mit der Sie die Navigation bei Bedarf abbrechen können.
Gut zu wissen: Obwohl
onClick
undonNavigate
ähnlich erscheinen mögen, dienen sie unterschiedlichen Zwecken.onClick
wird für alle Klick-Events ausgeführt, währendonNavigate
nur während der clientseitigen Navigation läuft. Einige wichtige Unterschiede:
- Bei Verwendung von Modifikatortasten (
Strg
/Cmd
+ Klick) wirdonClick
ausgeführt, aber nichtonNavigate
, da Next.js die Standardnavigation für neue Tabs verhindert.- Externe URLs lösen
onNavigate
nicht aus, da es nur für clientseitige und same-origin-Navigationen gilt.- Links mit dem
download
-Attribut funktionieren mitonClick
, aber nicht mitonNavigate
, da der Browser die verlinkte URL als Download behandelt.
Beispiele
Die folgenden Beispiele zeigen, wie die <Link>
-Komponente in verschiedenen Szenarien verwendet wird.
Verlinkung zu dynamischen Routensegmenten
Für dynamische Routensegmente kann es praktisch sein, Template-Literale zu verwenden, um den Pfad des Links zu erstellen.
Beispielsweise können Sie eine Liste von Links zur dynamischen Route pages/blog/[slug].js
generieren:
Wenn das Kind eine benutzerdefinierte Komponente ist, die ein <a>
-Tag umschließt
Wenn das Kind von Link
eine benutzerdefinierte Komponente ist, die ein <a>
-Tag umschließt, müssen Sie passHref
zu Link
hinzufügen. Dies ist notwendig, wenn Sie Bibliotheken wie styled-components verwenden. Ohne dies hat das <a>
-Tag kein href
-Attribut, was die Barrierefreiheit Ihrer Website beeinträchtigt und sich möglicherweise auf die SEO auswirkt. Wenn Sie ESLint verwenden, gibt es eine eingebaute Regel next/link-passhref
, um die korrekte Verwendung von passHref
sicherzustellen.
- Wenn Sie die JSX-Pragma-Funktion (
@jsx jsx
) von emotion verwenden, müssen SiepassHref
auch dann verwenden, wenn Sie direkt ein<a>
-Tag verwenden. - Die Komponente sollte die
onClick
-Property unterstützen, um die Navigation korrekt auszulösen.
Verschachtelung einer funktionalen Komponente
Wenn das Kind von Link
eine funktionale Komponente ist, müssen Sie zusätzlich zu passHref
und legacyBehavior
die Komponente in React.forwardRef
wrappen:
Übergeben eines URL-Objekts
Link
kann auch ein URL-Objekt empfangen und es automatisch formatieren, um die URL-Zeichenkette zu erstellen:
Das obige Beispiel enthält einen Link zu:
- Einer vordefinierten Route:
/about?name=test
- Einer dynamischen Route:
/blog/my-post
Sie können jede Property verwenden, wie in der Node.js URL-Modul-Dokumentation definiert.
URL ersetzen statt pushen
Das Standardverhalten der Link
-Komponente besteht darin, eine neue URL in den history
-Stack zu pushen
. Sie können die replace
-Prop verwenden, um das Hinzufügen eines neuen Eintrags zu verhindern, wie im folgenden Beispiel:
Scrollen zum Seitenanfang deaktivieren
Das Standardverhalten von Link
ist das Scrollen zum Seitenanfang. Wenn ein Hash definiert ist, wird zur spezifischen id gescrollt, wie bei einem normalen <a>
-Tag. Um das Scrollen zum Seitenanfang / Hash zu verhindern, kann scroll={false}
zu Link
hinzugefügt werden:
Prefetching von Links in Middleware
Es ist üblich, Middleware für Authentifizierung oder andere Zwecke zu verwenden, die eine Umleitung des Benutzers auf eine andere Seite beinhalten. Damit die <Link />
-Komponente Links mit Rewrites über Middleware korrekt prefetchen kann, müssen Sie Next.js sowohl die anzuzeigende URL als auch die zu prefetchende URL mitteilen. Dies ist notwendig, um unnötige Anfragen an die Middleware zu vermeiden, um die korrekte Route für das Prefetching zu ermitteln.
Beispiel: Wenn Sie eine /dashboard
-Route bereitstellen möchten, die authentifizierte und Besucher-Ansichten hat, können Sie folgendes in Ihrer Middleware hinzufügen, um den Benutzer auf die richtige Seite umzuleiten:
In diesem Fall würden Sie folgenden Code in Ihrer <Link />
-Komponente verwenden:
Gut zu wissen: Wenn Sie Dynamische Routen verwenden, müssen Sie Ihre
as
- undhref
-Props anpassen. Beispiel: Wenn Sie eine dynamische Route wie/dashboard/authed/[user]
haben, die Sie über Middleware anders darstellen möchten, würden Sie schreiben:<Link href={{ pathname: '/dashboard/authed/[user]', query: { user: username } }} as="/dashboard/[user]">Profil</Link>
.
Blockieren der Navigation
Sie können die onNavigate
-Prop verwenden, um die Navigation zu blockieren, wenn bestimmte Bedingungen erfüllt sind, z.B. wenn ein Formular ungespeicherte Änderungen enthält. Wenn Sie die Navigation über mehrere Komponenten in Ihrer App hinweg blockieren müssen (z.B. um die Navigation von jedem Link zu verhindern, während ein Formular bearbeitet wird), bietet React Context eine saubere Möglichkeit, diesen Blockierstatus zu teilen. Erstellen Sie zunächst einen Context, um den Blockierstatus der Navigation zu verfolgen:
Erstellen Sie eine Formularkomponente, die den Context verwendet:
Erstellen Sie eine benutzerdefinierte Link-Komponente, die die Navigation blockiert:
Erstellen Sie eine Navigationskomponente:
Schließlich umschließen Sie Ihre App mit dem NavigationBlockerProvider
im Root-Layout und verwenden die Komponenten in Ihrer Seite:
Verwenden Sie dann die Nav
- und Form
-Komponenten in Ihrer Seite:
Wenn ein Benutzer versucht, mit CustomLink
wegzunavigieren, während das Formular ungespeicherte Änderungen enthält, wird er aufgefordert, dies zu bestätigen, bevor er die Seite verlässt.
Versionsverlauf
Version | Änderungen |
---|---|
v15.3.0 | onNavigate -API hinzugefügt |
v13.0.0 | Benötigt kein untergeordnetes <a> -Tag mehr. Ein Codemod wird bereitgestellt, um Ihre Codebasis automatisch zu aktualisieren. |
v10.0.0 | href -Props, die auf eine dynamische Route verweisen, werden automatisch aufgelöst und benötigen keine as -Prop mehr. |
v8.0.0 | Verbesserte Prefetching-Leistung. |
v1.0.0 | next/link eingeführt. |