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ängigen
page404.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
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
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 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
// 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
<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 |