useRouter
Wenn Sie innerhalb einer Funktionskomponente in Ihrer App auf das router
-Objekt zugreifen möchten, können Sie den useRouter
Hook verwenden. Hier ist ein Beispiel:
useRouter
ist ein React Hook, was bedeutet, dass er nicht mit Klassen verwendet werden kann. Sie können entweder withRouter verwenden oder Ihre Klasse in einer Funktionskomponente einwickeln.
router
-Objekt
Dies ist die Definition des router
-Objekts, das sowohl von useRouter
als auch von withRouter
zurückgegeben wird:
pathname
:String
- Der Pfad für die aktuelle Routendatei nach/pages
. Daher sindbasePath
,locale
und der abschließende Schrägstrich (trailingSlash: true
) nicht enthalten.query
:Object
- Die als Objekt geparste Abfragezeichenfolge, einschließlich dynamischer Routenparameter. Bei Vorrendering wird es ein leeres Objekt sein, wenn die Seite keine serverseitige Rendering verwendet. Standard ist{}
asPath
:String
- Der Pfad, wie er im Browser angezeigt wird, einschließlich Suchparametern und unter Berücksichtigung dertrailingSlash
-Konfiguration.basePath
undlocale
sind nicht enthalten.isFallback
:boolean
- Ob die aktuelle Seite sich im Fallback-Modus befindet.basePath
:String
- Der aktive basePath (wenn aktiviert).locale
:String
- Das aktive Gebietsschema (wenn aktiviert).locales
:String[]
- Alle unterstützten Gebietsschemas (wenn aktiviert).defaultLocale
:String
- Das aktuelle Standard-Gebietsschema (wenn aktiviert).domainLocales
:Array<{domain, defaultLocale, locales}>
- Alle konfigurierten Domain-Gebietsschemas.isReady
:boolean
- Ob die Router-Felder clientseitig aktualisiert und zur Verwendung bereit sind. Sollte nur innerhalb vonuseEffect
-Methoden verwendet werden und nicht für bedingtes Rendering auf dem Server. Siehe zugehörige Dokumentation für den Anwendungsfall mit automatisch statisch optimierten SeitenisPreview
:boolean
- Ob die Anwendung sich derzeit im Vorschaumodus befindet.
Die Verwendung des
asPath
-Feldes kann zu einer Diskrepanz zwischen Client und Server führen, wenn die Seite mit serverseitigem Rendering oder automatischer statischer Optimierung gerendert wird. Vermeiden Sie die Verwendung vonasPath
, bis dasisReady
-Feldtrue
ist.
Die folgenden Methoden sind im router
enthalten:
router.push
Behandelt clientseitige Übergänge, diese Methode ist nützlich für Fälle, in denen next/link
nicht ausreicht.
url
:UrlObject | String
- Die URL, zu der navigiert werden soll (siehe Node.JS URL-Modul-Dokumentation fürUrlObject
-Eigenschaften).as
:UrlObject | String
- Optionaler Decorator für den Pfad, der in der Browser-URL-Leiste angezeigt wird. Vor Next.js 9.5.3 wurde dies für dynamische Routen verwendet.options
- Optionales Objekt mit folgenden Konfigurationsoptionen:scroll
- Optionaler boolescher Wert, steuert das Scrollen zum Seitenanfang nach der Navigation. Standard isttrue
shallow
: Aktualisiert den Pfad der aktuellen Seite ohne erneutes Ausführen vongetStaticProps
,getServerSideProps
odergetInitialProps
. Standard istfalse
locale
- Optionaler String, gibt das Gebietsschema der neuen Seite an
Für externe URLs müssen Sie
router.push
nicht verwenden. window.location ist dafür besser geeignet.
Navigieren zu pages/about.js
, welches eine vordefinierte Route ist:
Navigieren zu pages/post/[pid].js
, welches eine dynamische Route ist:
Umleitung des Benutzers zu pages/login.js
, nützlich für Seiten hinter Authentifizierung:
Zurücksetzen des Status nach der Navigation
Bei der Navigation zur gleichen Seite in Next.js wird der Status der Seite standardmäßig nicht zurückgesetzt, da React nicht unmounted wird, wenn sich die übergeordnete Komponente nicht geändert hat.
Im obigen Beispiel führt die Navigation zwischen /one
und /two
nicht zum Zurücksetzen des Zählers. Das useState
wird zwischen den Renderings beibehalten, da die React-Komponente der obersten Ebene, Page
, gleich bleibt.
Wenn Sie dieses Verhalten nicht wünschen, haben Sie ein paar Optionen:
-
Stellen Sie sicher, dass jeder Status manuell mit
useEffect
aktualisiert wird. Im obigen Beispiel könnte das so aussehen: -
Verwenden Sie einen React
key
, um React anzuweisen, die Komponente neu zu mounten. Um dies für alle Seiten zu tun, können Sie eine benutzerdefinierte App verwenden:
Mit URL-Objekt
Sie können ein URL-Objekt genauso verwenden wie für next/link
. Funktioniert sowohl für url
als auch für as
-Parameter:
router.replace
Ähnlich dem replace
-Prop in next/link
verhindert router.replace
das Hinzufügen eines neuen URL-Eintrags in den history
-Stack.
- Die API für
router.replace
ist genau dieselbe wie die API fürrouter.push
.
Werfen Sie einen Blick auf das folgende Beispiel:
router.prefetch
Seiten vorabladen für schnellere clientseitige Übergänge. Diese Methode ist nur nützlich für Navigationen ohne next/link
, da next/link
automatisch das Vorabladen von Seiten übernimmt.
Dies ist eine Funktion, die nur in der Produktionsumgebung verfügbar ist. Next.js lädt Seiten in der Entwicklungsumgebung nicht vorab.
url
- Die URL zum Vorabladen, einschließlich expliziter Routen (z.B./dashboard
) und dynamischer Routen (z.B./product/[id]
)as
- Optionaler Decorator fürurl
. Vor Next.js 9.5.3 wurde dies zum Vorabladen dynamischer Routen verwendet.options
- Optionales Objekt mit den folgenden erlaubten Feldern:locale
- erlaubt die Angabe eines anderen Gebietsschemas als des aktiven. Wennfalse
, mussurl
das Gebietsschema enthalten, da das aktive Gebietsschema nicht verwendet wird.
Nehmen wir an, Sie haben eine Anmeldeseite und leiten den Benutzer nach der Anmeldung zum Dashboard weiter. In diesem Fall können wir das Dashboard vorabladen, um einen schnelleren Übergang zu ermöglichen, wie im folgenden Beispiel:
router.beforePopState
In einigen Fällen (zum Beispiel bei Verwendung eines Custom Servers) möchten Sie möglicherweise den popstate-Event abhören und etwas tun, bevor der Router darauf reagiert.
cb
- Die Funktion, die bei eingehendenpopstate
-Events ausgeführt wird. Die Funktion erhält den Zustand des Events als Objekt mit folgenden Eigenschaften:url
:String
- die Route für den neuen Zustand. Dies ist normalerweise der Name einerSeite
as
:String
- die URL, die im Browser angezeigt wirdoptions
:Object
- Zusätzliche Optionen, die von router.push gesendet werden
Wenn cb
false
zurückgibt, behandelt der Next.js-Router popstate
nicht, und Sie sind in diesem Fall für die Behandlung verantwortlich. Weitere Informationen finden Sie unter Deaktivieren des Dateisystem-Routings.
Sie könnten beforePopState
verwenden, um die Anfrage zu manipulieren oder eine SSR-Aktualisierung zu erzwingen, wie im folgenden Beispiel:
router.back
Zur vorherigen Seite in der Verlaufschronik zurückkehren. Entspricht dem Klicken auf die Zurück-Taste des Browsers. Führt window.history.back()
aus.
router.reload
Die aktuelle URL neu laden. Entspricht dem Klicken auf die Aktualisieren-Taste des Browsers. Führt window.location.reload()
aus.
router.events
Sie können verschiedene Ereignisse im Next.js-Router verfolgen. Hier ist eine Liste der unterstützten Ereignisse:
routeChangeStart(url, { shallow })
- Wird ausgelöst, wenn eine Route zu wechseln beginntrouteChangeComplete(url, { shallow })
- Wird ausgelöst, wenn eine Route vollständig gewechselt hatrouteChangeError(err, url, { shallow })
- Wird ausgelöst, wenn ein Fehler beim Routenwechsel auftritt oder ein Routenladen abgebrochen wirderr.cancelled
- Zeigt an, ob die Navigation abgebrochen wurde
beforeHistoryChange(url, { shallow })
- Wird ausgelöst, bevor sich der Browserverlauf änderthashChangeStart(url, { shallow })
- Wird ausgelöst, wenn sich der Hash ändern wird, aber nicht die SeitehashChangeComplete(url, { shallow })
- Wird ausgelöst, wenn sich der Hash geändert hat, aber nicht die Seite
Hinweis: Hier ist
url
die im Browser angezeigte URL, einschließlich desbasePath
.
Um beispielsweise das Router-Ereignis routeChangeStart
zu verfolgen, öffnen oder erstellen Sie pages/_app.js
und abonnieren Sie das Ereignis wie folgt:
Wir verwenden eine Benutzerdefinierte App (
pages/_app.js
), um das Ereignis zu abonnieren, da sie bei Seitennavigationen nicht unmontiert wird, aber Sie können Router-Ereignisse in jeder Komponente Ihrer Anwendung abonnieren.
Router-Ereignisse sollten registriert werden, wenn eine Komponente montiert wird (useEffect oder componentDidMount / componentWillUnmount) oder imperativ, wenn ein Ereignis auftritt.
Wenn ein Routenladen abgebrochen wird (z.B. durch schnelles Klicken auf zwei Links), wird routeChangeError
ausgelöst. Und der übergebene err
wird eine cancelled
-Eigenschaft besitzen, die auf true
gesetzt ist, wie im folgenden Beispiel:
Der next/compat/router
Export
Dies ist derselbe useRouter
-Hook, kann aber sowohl im app
- als auch im pages
-Verzeichnis verwendet werden.
Er unterscheidet sich von next/router
dadurch, dass er keinen Fehler auslöst, wenn der Pages-Router nicht montiert ist, und stattdessen einen Rückgabetyp von NextRouter | null
hat.
Dies ermöglicht Entwicklern, Komponenten so zu konvertieren, dass sie sowohl im app
- als auch im pages
-Verzeichnis während des Übergangs zum app
-Router laufen.
Eine Komponente, die vorher so aussah:
Wird einen Fehler verursachen, wenn er zu next/compat/router
konvertiert wird, da null
nicht destrukturiert werden kann. Stattdessen können Entwickler neue Hooks nutzen:
Diese Komponente funktioniert jetzt in beiden Verzeichnissen pages
und app
. Wenn die Komponente nicht mehr in pages
verwendet wird, können Sie die Referenzen zum Compat-Router entfernen:
Verwendung von useRouter
außerhalb des Next.js-Kontexts in pages
Ein weiterer spezifischer Anwendungsfall ist die Rendering von Komponenten außerhalb des Next.js-Anwendungskontexts, z.B. innerhalb von getServerSideProps
im pages
-Verzeichnis. In diesem Fall kann der Compat-Router verwendet werden, um Fehler zu vermeiden:
Mögliche ESLint-Fehler
Bestimmte Methoden des router
-Objekts geben ein Promise zurück. Wenn Sie die ESLint-Regel no-floating-promises aktiviert haben, erwägen Sie, sie entweder global oder für die betroffene Zeile zu deaktivieren.
Wenn Ihre Anwendung diese Regel benötigt, sollten Sie entweder das Promise void
en – oder eine async
-Funktion verwenden, das Promise await
en und dann den Funktionsaufruf void
en. Dies gilt nicht, wenn die Methode aus einem onClick
-Handler heraus aufgerufen wird.
Die betroffenen Methoden sind:
router.push
router.replace
router.prefetch
Mögliche Lösungen
withRouter
Wenn useRouter
nicht optimal für Sie ist, kann withRouter
das gleiche router
-Objekt zu jeder Komponente hinzufügen.
Verwendung
TypeScript
Um Klassenkomponenten mit withRouter
zu verwenden, muss die Komponente eine Router-Prop akzeptieren: