Vue - Routing: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „Mit Vue erstellt man oft sogenannte Single Page Applications. D.h. alle Ansichten (Views) sind technisch gesehen auf einer HTML-Seite. Auch wenn ich zwischen…“)
 
Zeile 8: Zeile 8:
  
 
  npm install --save vue-router
 
  npm install --save vue-router
 +
Wenn es später "not found" compiler warnings gibt versuche:
 +
npm install --save vue-router@next
 +
 +
== Router und Routes registrieren ==
 +
'''Ein Router läßt sich so erzeugen:'''
 +
main.js
 +
<syntaxhighlight lang="javascript">
 +
//import { createRouter } from 'vue-router'; // without history
 +
import { createRouter, createWebHistory } from 'vue-router';
 +
const router = createRouter();
 +
</syntaxhighlight>
 +
In der app läßt er sich mit '''use''' nutzen:
 +
app.use(router)
 +
wobei app eine Vue Instanz ist.
 +
 +
Zusätzlich zum router haben wir noch das createWebHistory importiert. Damit kann Vue die BrowserHistory auslesen.
 +
 +
Der Router benötigt eine Konfiguration in der wir zumindest die history und die routes bestimmen:
 +
<syntaxhighlight lang="javascript">
 +
const router = createRouter({
 +
    history: createWebHistory(), // we use built in browser support
 +
    routes: []
 +
});
 +
</syntaxhighlight>
 +
Das routes array bekommt später alle Routes die wir nutzen möchten.
 +
 +
Ziel ist im Prinzip eine eigene URL für bestimmte Components zu generieren. Eine Route benötigt also zumindest ein paar Informationen
 +
* einen '''Pfad''' (path) für die URL
 +
* eine '''Komponente''' die gerendert werden soll
 +
* eine '''Information an welcher Stelle des Views''' die Komponente gerendert werden soll.
 +
 +
Pfad und Komponente lassen sich in der routes Konfiguration angeben. Damit sind unser main.js Code jetzt so aus:
 +
 +
main.js
 +
<syntaxhighlight lang="javascript">
 +
import { createApp } from 'vue';
 +
import { createRouter, createWebHistory } from 'vue-router';
 +
 +
import App from './App.vue';
 +
import TeamsList from './components/teams/TeamsList.vue';
 +
import UsersList from './components/users/UsersList.vue';
 +
 +
const router = createRouter({
 +
    history: createWebHistory(), // we use built in browser support
 +
    routes: [
 +
        { path: '/teams', component: TeamsList },
 +
        { path: '/users', component: UsersList }
 +
    ]
 +
});
 +
const app = createApp(App)
 +
app.use(router);
 +
 +
app.mount('#app');
 +
 +
</syntaxhighlight>
 +
 +
=== <router-view> ===
 +
Nun fehlt noch die Ansicht und die Information wo diese gerendert werden soll. Ohne Routing macht man Ansichten oft über dynamische Komponenten und den <component> Tag.
 +
<component :is="activePage"></component>
 +
Der vue-router stellt eine eigene component für diesen Zweck zur Verfügung der anstelle verwendet werden kann den router-view:
 +
<router-view></router-view>
 +
 +
Damit ändert sich auch einiges am Code der Komponente. Die in main.js importierten und in routes registrierten Komponenten '''stehen automatisch zur Verfügung''' und müssen nicht mehr global oder lokal importiert und auch nicht mehr registriert werden.
 +
App.vue
 +
<syntaxhighlight lang="html5">
 +
<template>
 +
  <the-navigation @set-page="setActivePage"></the-navigation>
 +
  <main>
 +
    <router-view></router-view>
 +
  </main>
 +
</template>
 +
</syntaxhighlight>
 +
Wenn wir jetzt die Seite mit
 +
myDomain.de/teams
 +
aufrufen wird an der Stelle von router-view die Komponente TeamsList.vue gerendert.
 +
 +
=== Navigation <router-link>===
 +
Wenn wir eine Navigation in der Seite haben muss diese ebenfalls anders arbeiten. Klassischerweise hat man eine Property z.b. active Page, die man über buttons o.ä. setzt und darüber eine dynamische component steuert. Mit dabei sind dann oftmals custom events um über mehrere Komponenten hinweg die Variable zu setzen und methods ...
 +
 +
Das

Version vom 7. Januar 2021, 20:01 Uhr

Mit Vue erstellt man oft sogenannte Single Page Applications. D.h. alle Ansichten (Views) sind technisch gesehen auf einer HTML-Seite.

Auch wenn ich zwischen Komponenten oder Ansichten wechlse bleibt daher die URL der Seite immer gleich. Wenn man den Link teilt, landert der User immer auf der Startseite.

Mit dem Routing von Vue kann man für Views eigene URLs zur Verfügung stellen. So dass jede Ansicht der App mit einer eigenen URL repräsentiert werden kann.

Routing in Vue funktioniert mit dem vue-router. Dies ist ein zusätzliches Package des Entwickler Teams, das zunächst in Deinem Projekt installiert werden muss:

npm install --save vue-router

Wenn es später "not found" compiler warnings gibt versuche:

npm install --save vue-router@next

Router und Routes registrieren

Ein Router läßt sich so erzeugen: main.js

//import { createRouter } from 'vue-router'; // without history
import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter();

In der app läßt er sich mit use nutzen:

app.use(router)

wobei app eine Vue Instanz ist.

Zusätzlich zum router haben wir noch das createWebHistory importiert. Damit kann Vue die BrowserHistory auslesen.

Der Router benötigt eine Konfiguration in der wir zumindest die history und die routes bestimmen:

const router = createRouter({
    history: createWebHistory(), // we use built in browser support
    routes: []
});

Das routes array bekommt später alle Routes die wir nutzen möchten.

Ziel ist im Prinzip eine eigene URL für bestimmte Components zu generieren. Eine Route benötigt also zumindest ein paar Informationen

  • einen Pfad (path) für die URL
  • eine Komponente die gerendert werden soll
  • eine Information an welcher Stelle des Views die Komponente gerendert werden soll.

Pfad und Komponente lassen sich in der routes Konfiguration angeben. Damit sind unser main.js Code jetzt so aus:

main.js

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

import App from './App.vue';
import TeamsList from './components/teams/TeamsList.vue';
import UsersList from './components/users/UsersList.vue';

const router = createRouter({
    history: createWebHistory(), // we use built in browser support
    routes: [
        { path: '/teams', component: TeamsList },
        { path: '/users', component: UsersList }
    ]
});
const app = createApp(App)
app.use(router);

app.mount('#app');

<router-view>

Nun fehlt noch die Ansicht und die Information wo diese gerendert werden soll. Ohne Routing macht man Ansichten oft über dynamische Komponenten und den <component> Tag.

<component :is="activePage"></component>

Der vue-router stellt eine eigene component für diesen Zweck zur Verfügung der anstelle verwendet werden kann den router-view:

<router-view></router-view>

Damit ändert sich auch einiges am Code der Komponente. Die in main.js importierten und in routes registrierten Komponenten stehen automatisch zur Verfügung und müssen nicht mehr global oder lokal importiert und auch nicht mehr registriert werden. App.vue

<template>
  <the-navigation @set-page="setActivePage"></the-navigation>
  <main>
    <router-view></router-view>
  </main>
</template>

Wenn wir jetzt die Seite mit

myDomain.de/teams

aufrufen wird an der Stelle von router-view die Komponente TeamsList.vue gerendert.

Navigation <router-link>

Wenn wir eine Navigation in der Seite haben muss diese ebenfalls anders arbeiten. Klassischerweise hat man eine Property z.b. active Page, die man über buttons o.ä. setzt und darüber eine dynamische component steuert. Mit dabei sind dann oftmals custom events um über mehrere Komponenten hinweg die Variable zu setzen und methods ...

Das