Vue3-Routing (Vue Router)

In diesem Kapitel führen wir in das Vue-Routing ein.

Vue-Routing ermöglicht es uns, über verschiedene URLs auf unterschiedliche Inhalte zuzugreifen.

Mit Vue können wir Multi-View-Single-Page-Webanwendungen (SPA) umsetzen.

Vue.js-Routing erfordert das Laden dervue-router-Bibliothek

URL der chinesischen Dokumentation:vue-router-Dokumentation。

Vue Router ist dafür verantwortlich, URL-Pfade auf Komponenten in der Anwendung abzubilden. Wenn Benutzer in der App navigieren, wird die URL aktualisiert, aber die Seite wird nicht neu geladen, was ein reibungsloses Benutzererlebnis bietet.

Die obige Abbildung zeigt einezweistufig verschachtelte Routenstruktur:

  • oberste Ebene (App.vuevon<router-view>)verantwortlich für das Rendern voneigenständigen Layouts(wie zum BeispielLogin.vue) oderHauptrahmen-Layout(Layout.vue)。
  • Hauptrahmen-Layout (Layout.vue)enthält intern eine zweite<router-view>, die verwendet wird, umuntergeordnete Komponenten der Funktionsseite zu rendern(wie zum BeispielDashboard.vue、User.vue), wodurch eine dauerhafte Anzeige von Kopfzeile, Seitenleiste und Fußzeile erreicht wird.
  • Nicht übereinstimmende Pfade führen schließlich zu einer unabhängigenpage404.vue。

Kernkomponenten

Komponente Beschreibung Zugriff auf die Options API Zugriff auf die Composition API
routerBeispiel Eine Instanz des gesamten Routing-Systems, die für globale Navigation, das Hinzufügen von Routen usw. verwendet wird. this.$router useRouter()
routeObjekt Das derzeit aktive Routen-Zustandsobjekt, das Informationen wie die aktuelle URL, Parameter, Query usw. enthält. this.$route useRoute()
<router-link> Eine Komponente, die für die Navigation in der Anwendung verwendet wird; sie wird als ein<a>tag gerendert, kann aber das standardmäßige Neuladen der Seite verhindern. - -
<router-view> Die von der Route gefundene Komponente wird an dieser Position gerendert. - -

Installation

npm-Installation

npm install vue-router

npm (China-Spiegel)

Es wird empfohlen, den Taobao-Mirror zu verwenden:

npm install -g cnpm --registry=https://registry.npmmirror.com
cnpm install vue-router@4

Direkter Download / CDN

https://unpkg.com/vue-router@4

Grundlegende Verwendung

1. Routing-Tabelle erstellen

// src/router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
]

export default createRouter({
  history: createWebHistory(),
  routes
})

2. In der Anwendung mounten

// main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

createApp(App).use(router).mount('#app')

3. Seiten-Outlet

<router-view></router-view>

4. Navigation

<router-link to="/about">About</router-link>

5. Dynamisches Routing

{ path: '/user/:id', component: User }

Beim Aufruf von /user/10, $route.params.id === '10'.

6. Lazy Loading

const About = () => import('../views/About.vue')

7. Navigationswächter (Authentifizierung)

router.beforeEach((to, from, next) => {
  next()
})

8. Weiterleitung

{ path: '/old', redirect: '/' }

9、404

{ path: '/:pathMatch(.*)*', component: NotFound }

Einfaches Beispiel

Vue.js + vue-router können ganz einfach eine Single-Page-Anwendung implementieren.

<router-link>ist eine Komponente, mit der ein Navigationslink eingerichtet wird, um zwischen verschiedenen HTML-Inhalten zu wechseln.toDas `to`-Attribut ist die Zieladresse, d. h. der anzuzeigende Inhalt.

Im folgenden Beispiel fügen wir vue-router hinzu, konfigurieren dann Komponenten- und Routenzuordnungen und teilen vue-router anschließend mit, wo sie gerendert werden sollen. Der Code sieht wie folgt aus:

HTML-Code

<div id="app"> <h1>Hallo App!</h1> <p> <!--Verwenden Sie die Komponente router-link zur Navigation--> <!--Geben Sie den Link durch Übergeben von `to` an--> <!--`<router-link>` rendert ein `<a>`-Tag mit dem korrekten `href`-Attribut--> <router-link to="/">Zur Startseite</router-link> <router-link to="/about">Zu About</router-link> </p> <!--Router-Ansicht--> <!--Die von der Route zugeordnete Komponente wird hier gerendert.--> <router-view></router-view> </div>

router-link

Beachten Sie, dass wir kein reguläres `<a>`-Tag verwendet haben, sondern eine benutzerdefinierte Komponente `router-link` zum Erstellen von Links genutzt haben. Dadurch kann Vue Router die URL ändern, ohne die Seite neu zu laden, und die URL-Generierung und -Kodierung übernehmen. Wir werden später sehen, wie wir von diesen Funktionen profitieren können.

router-view

`router-view` zeigt die Komponente an, die der URL entspricht. Sie können es überall platzieren, wo es zu Ihrem Layout passt.

JavaScript-Code

//1. Definieren Sie Routenkomponenten. //Sie können auch aus anderen Dateien importiert werden. const Home = { template: '<div>Home</div>' } const About = { template: '<div>About</div>' } //2. Definieren Sie einige Routen //Jede Route muss einer Komponente zugeordnet werden. //Verschachtelte Routen besprechen wir später. const routes = [ { path: '/', component: Home }, { path: '/about', component: About }, ] //3. Erstellen Sie die Router-Instanz und übergeben Sie die `routes`-Konfiguration //Sie können hier weitere Konfiguration hinzufügen, aber im Moment halten wir //es vorerst einfach. const router = VueRouter.createRouter({ //4. Intern wird eine Implementierung für den History-Modus bereitgestellt. Der Einfachheit halber verwenden wir hier den Hash-Modus. history: VueRouter.createWebHashHistory(), routes, //Kurzform für `routes: routes` }) //5. Die Root-Instanz erstellen und mounten. const app = Vue.createApp({}) //Stellen Sie sicher, dass Sie die Router-Instanz _verwenden_, damit //die gesamte App das Routing unterstützt. app.use(router) app.mount('#app') //Jetzt ist die Anwendung gestartet!

Ausprobieren »

Bei angeklickten Navigationslinks werden Stile hinzugefügtclass ="router-link-exact-active router-link-active"。

Anwendungsbeispiel

Das folgende Beispiel behandelt die Routing-Definition、Erstellung、Mounten、NavigationundRenderingfünf Kernschritte.

1. main.js (Einstiegsdatei)

Beispiel

import { createApp } from 'vue';
import App from './App.vue';
import router from './router'; // Die konfigurierte Router-Instanz importieren

// 1. Eine Vue-Anwendungsinstanz erstellen
const app = createApp(App);

// 2. Den Router mounten
app.use(router);

// 3. In das DOM einbinden
app.mount('#app');

2. router/index.js (Routenkonfiguration)

Beispiel

import { createRouter, createWebHistory } from 'vue-router';

// Routenkomponenten importieren (synchrone Importe verwenden, um das Beispiel zu vereinfachen)
const Home = { template: '<h2>Startseite</h2><p>Willkommen auf der Startseite der Anwendung!</p>' };
const About = { template: '<h2>Über uns</h2><p>Erfahren Sie mehr über dieses Projekt.</p>' };

// Das Array der Routendatensätze definieren
const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: About
  },
  // 404-Übereinstimmung (an letzter Stelle platzieren)
  {
    path: '/:pathMatch(.*)*',
    name: 'NotFound',
    component: { template: '<div>404 Nicht gefunden</div>' }
  }
];

// Router-Instanz erstellen
const router = createRouter({
  // HTML5-History-Modus verwenden (empfohlen)
  history: createWebHistory(),
  routes, // Routenkonfiguration
});

export default router;

3. App.vue (Root-Komponente)

Beispiel

<template>
  <div>
    <h1>Vue Router Beispiel</h1>
   
    <nav>
      <router-link to="/" active-class="active-link">Startseite</router-link> |
      <router-link to="/about" active-class="active-link">Über</router-link> |
      <router-link to="/nonexistent">404-Demo</router-link>
    </nav>
   
    <hr>
   
    <main>
      <router-view></router-view>
    </main>
  </div>
</template>

<style>
/* Einfache aktive Stile */
.active-link {
  font-weight: bold;
color: #427EB9; /* Vue-Grün */
}
/* Link-Abstand anpassen */
nav a {
  margin: 0 5px;
  text-decoration: none;
}
</style>

Wenn du diese Anwendung ausführst:

  • Klicke auf denHome-Link, die URL ändert sich zu/,<router-view>wird angezeigt inHome PageKomponenteninhalt.
  • Klicke auf denAbout-Link, die URL ändert sich zu/about,<router-view>wird angezeigt inAbout UsKomponenteninhalt.
  • Klicke auf den404 Demo-Link, die URL ändert sich zu/nonexistent,<router-view>wird angezeigt in404 Not FoundKomponenteninhalt.

<router-link> zugehörige Attribute

Als Nächstes lernen wir mehr über die Attribute von <router-link>.

auf

Stellt den Link zur Zielroute dar. Beim Klick wird der Wert von `to` sofort an `router.push()` übergeben, daher kann dieser Wert eine Zeichenkette oder ein Objekt sein, das den Zielort beschreibt.

<!-- 字符串 -->
<router-link to="home">Home</router-link>
<!-- 渲染结果 -->
<a href="home.html">Home</a>

<!-- 使用 v-bind 的 JS 表达式 -->
<router-link v-bind:to="'home'">Home</router-link>

<!-- 不写 v-bind 也可以,就像绑定别的属性一样 -->
<router-link :to="'home'">Home</router-link>

<!-- 同上 -->
<router-link :to="{ path: 'home' }">Home</router-link>

<!-- 命名的路由 -->
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>

<!-- 带查询参数,下面的结果为 /register?plan=private -->
<router-link :to="{ path: 'register', query: { plan: 'private' }}">Register</router-link>

ersetzen

Wenn das Attribut replace gesetzt ist, ruft der Klick router.replace() anstelle von router.push() auf, und nach der Navigation bleibt kein Verlaufseintrag zurück.

<router-link :to="{ path: '/abc'}" replace></router-link>

append

Wenn das Attribut append gesetzt ist, wird der Pfad dem aktuellen (relativen) Pfad vorangestellt. Wenn wir beispielsweise von /a zu einem relativen Pfad b navigieren, lautet der Pfad ohne append /b, mit append /a/b.

<router-link :to="{ path: 'relative/path'}" append></router-link>

-Tag hinzu

Manchmal möchte man<router-link>um als bestimmtes Tag zu rendern, zum Beispiel<li>.tagAlso verwenden wir

<router-link to="/foo" tag="li">foo</router-link>
<!-- 渲染结果 -->
<li>foo</li>

active-class

Prop, um anzugeben, welches Tag. Es hört weiterhin auf Klicks und löst die Navigation aus.

<style>
   ._active{
      background-color : red;
   }
</style>
<p>
   <router-link v-bind:to = "{ path: '/route1'}" active-class = "_active">Router Link 1</router-link>
   <router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2</router-link>
</p>

Legt den CSS-Klassennamen fest, der verwendet wird, wenn der Link aktiv ist. Er kann durch den folgenden Code ersetzt werden.classHinweis hieractive-class="_active"。

exact-active-class

Verwenden Sie

<p>
   <router-link v-bind:to = "{ path: '/route1'}" exact-active-class = "_active">Router Link 1</router-link>
   <router-link v-bind:to = "{ path: '/route2'}" tag = "span">Router Link 2</router-link>
</p>

event

Konfiguriert die Klasse, die aktiv sein soll, wenn der Link genau übereinstimmt. Sie kann durch den folgenden Code ersetzt werden.

<router-link v-bind:to = "{ path: '/route1'}" event = "mouseover">Router Link 1</router-link>

Der obige Code setzt das Ereignis auf mouseover, und wenn die Maus über Router Link 1 bewegt wird, ändert sich der navigierte HTML-Inhalt.


Vue Router (v4, Vue 3) Handbuch zur Kern-API

I.createRouterKonfigurationsoptionen

Konfigurationselement Zweck Beispiel
history URL-Modus angeben createWebHistory()
routes Array zur Definition der Routentabelle [{ path: '/', component: Home }]
scrollBehavior Scrollposition der Seite steuern { top: 0 }
strict Ob nachgestellte Schrägstriche streng unterschieden werden true
linkActiveClass Klasse, wenn der Link aktiv ist 'active'
linkExactActiveClass Klasse, wenn der Link exakt aktiv ist 'exact-active'
parseQuery Benutzerdefiniertes Parsen von URL-Abfragen (q) => ({...})
stringifyQuery Benutzerdefinierte Serialisierung von URL-Abfragen (obj) => 'a=1'

II. History-Factory

API Zweck Beispiel
createWebHistory() HTML5-History-Modus verwenden (empfohlen) createWebHistory()
createWebHashHistory() Hash-Modus verwenden (URL enthält#) createWebHashHistory()
createMemoryHistory() Geeignet für SSR (Server-Side Rendering) createMemoryHistory()

III.RouteRecord(Route-Datensatz)

Feld Zweck Beispiel
path Definition des Route-Pfads /user/:id
name Route-Benennung name: 'User'
component Zugehörige Hauptkomponente UserView
components Für benannte Views (mehrere<router-view>) { default: A, left: B }
redirect Weiterleitungsziel redirect: '/login'
children Verschachtelte untergeordnete Routen definieren [ { path: 'profile' } ]
props wirdparamsAutomatisch in Komponente umwandelnprops props: true
meta Benutzerdefiniertes Meta-Informationsfeld { auth: true }
alias Aliase für die aktuelle Route hinzufügen (mehrere Einträge) alias: '/b'
beforeEnter Routenspezifischer Navigationswächter { beforeEnter: (to,from,next)=>{} }

IV. Router-Navigation (Router-Instanzmethoden)

Router-API Zweck Beispiel
router.push(to) Programmatische Navigation, fügt einen neuen Eintrag zum Verlaufsstapel hinzu router.push('/a')
router.replace(to) Programmatische Navigation, ersetzt den aktuellen Verlaufseintrag router.replace('/a')
router.back() Einen Schritt zurückgehen router.back()
router.forward() Einen Schritt vorwärtsgehen router.forward()
router.go(n) Den Verlaufsstapel manuell verschieben router.go(-1)
router.addRoute(route) Routeneinträge dynamisch hinzufügen router.addRoute({ name:'Post', ... })
router.removeRoute(name) Routeneinträge nach Namen entfernen router.removeRoute('user')
router.getRoutes() Alle Routeneinträge abrufen router.getRoutes()
router.hasRoute(name) Ermitteln, ob eine Route mit dem angegebenen Namen existiert router.hasRoute('user')

V. Navigationswächter

Wächter Geltungsbereich Hook-Signatur
router.beforeEach Global vorher (to, from, next) => {}
router.beforeResolve Globale Auflösungsphase (nachdem In-Komponenten-Guards und asynchrone Komponenten aufgelöst wurden) (to, from, next) => {}
router.afterEach Global danach (kann Navigation nicht verhindern) (to, from, failure) => {}
beforeEnter Routenspezifisch beforeEnter: (to, from, next) => {}
beforeRouteEnter In-Komponente (kein Zugriff aufthis) beforeRouteEnter(to, from, next) {}
beforeRouteUpdate In-Komponente (wenn die aktuelle Route wiederverwendet wird, z. B. bei Parameteränderungen) beforeRouteUpdate(to, from, next) {}
beforeRouteLeave In-Komponente (beim Verlassen dieser Komponente) beforeRouteLeave(to, from, next) {}

VI.<router-link>Props

Props Zweck Beispiel
to Zielroutenadresse to="/a"oder:to="{ name: 'user', params: { id: 1 } }"
replace Verwendung während der Navigationrouter.replace() <router-link replace>
custom Benutzerdefiniertes Rendering, wird mit Slots verwendet <router-link custom v-slot="{ href }">
active-class Klasse, die angewendet wird, wenn der Link aktiv ist 'active'
exact-active-class Klasse, die angewendet wird, wenn der Link genau übereinstimmt 'exact'

VII.<router-view>Props

Props Zweck Beispiel
name Wird für Multi-View-Rendering (benannte Ansicht) verwendet <router-view name="left">
route (Erweitert) Erzwingt die Angabe des zu rendernden Routenobjekts <router-view :route="someRoute">

VIII.Route(Aktuelles Routenobjekt)

Dieses Objekt erhält man überuseRoute()oderthis.$routeermittelt werden.

Feld Type Bedeutung Beispiel
params object Dynamische Pfadparameter route.params.id
query object URL-Query-Parameter route.query.q
hash string Hash-Wert in der URL (mit#) route.hash
fullPath string Vollständig aufgelöster Pfad (einschließlich Query und Hash) /user/1?x=1
name string Name der aktuellen Route 'User'
path string Aktueller Pfad (ohne Query und Hash) /user/1
meta object In der RoutenkonfigurationmetaInformation route.meta.auth
matched RouteRecord[] Alle von der Route abgeglichenen Datensätze (für verschachtelte Routen) route.matched

IX. Composition API

API Zweck Beispiel
useRoute() Das aktuelle Routenobjekt abrufen (Route) const route = useRoute()
useRouter() Die Router-Instanz abrufen (Router) const router = useRouter()

X. Programmatische Navigation (Vollständiges Beispiel)

Zweck Beispiel Hinweise
Navigation zu benannter Route router.push({ name:'User', params:{ id:10 } }) Empfohlene Methode, hängt nicht von der Pfadreihenfolge ab
Navigation mit Query-Parametern router.push({ path:'/search', query:{ q:'x' } }) Pfad + Query-Parameter
Awaitbarer push/replace await router.push('/a') Die Navigation ist asynchron, du kannst ihren Abschluss abwarten
Navigation über URL-Objekt router.push({ path: '/foo', hash: '#bar' }) Volle Kontrolle über URL-Details
Weitere Erweiterungen