13. project [vuejs-11]: routing en navigatie
Routing zorgt ervoor dat de gebruiker tussen de verschillende pagina’s van de applicatie kan navigeren.
De projectstructuur is als volgt:

13.1. Installatie van afhankelijkheden
Voor de routing in [Vue.js] is de afhankelijkheid [vue-router] vereist:

- in [1-3] wordt de afhankelijkheid [vue-router] geïnstalleerd;
- in [4-6] is, na installatie van de afhankelijkheid, het bestand [package.json] gewijzigd;
13.2. Het routeringsscript [router.js]
De navigatieregels van de applicatie staan opgeslagen in het bestand [router.js] (de naam van het script kan willekeurig zijn):
// benodigde imports voor de routering
import Vue from 'vue'
import VueRouter from 'vue-router'
// routeringsplugin
Vue.use(VueRouter)
// de doelcomponenten van de routing
import Component1 from './components/Component1.vue'
import Component2 from './components/Component2.vue'
import Component3 from './components/Component3.vue'
// de routes van de applicatie
const routes = [
// home
{ path: '/', name: 'home', component: Component1 },
// Component1
{
path: '/vue1', name: 'vue1', component: Component1
},
{
// Component2
path: '/vue2', name: 'vue2', component: Component2
},
// Component3
{
path: '/vue3', name: 'vue3', component: Component3
},
]
// de router
const router = new VueRouter({
routes,
mode: 'history',
})
// de router exporteren
export default router
Opmerkingen
- het script [router.js] bepaalt de routeringsregels van onze applicatie;
- regel 1-6: activering van de plug-in [vue-router] die nodig is voor de routing. Voor deze activering moet de klasse/functie [Vue] (regel 2) en de routeringsplugin (regel 3) worden geïmporteerd. Deze plugin is geïnstalleerd samen met de afhankelijkheid [router] die we zojuist hebben geïnstalleerd;
- regels 8-11: importeren van de doelweergaven voor de routing;
- regels 15-21: definitie van de routetabel. Elk element van deze tabel is een object met de volgende eigenschappen:
- [path]: de URL van de weergave, die we in het veld [URL] van de browser willen zien. Je kunt hier vrijelijk invullen wat je wilt;
- [name]: de naam van de route. Ook hier kun je invullen wat je wilt;
- [component]: de component die de weergave weergeeft. Dit moet een bestaande component zijn;
We hebben hier dus vier routes [/, /vue1, /vue2, /vue3].
- regels 33-36: de router is een instantie van de klasse [VueRouter] die in regel 3 is geïmporteerd. De constructor van [VueRouter] wordt hier gebruikt met twee parameters:
- de routes van de applicatie;
- een modus voor het schrijven van de URL in de browser: de standaardmodus [hash] schrijft de URL in de vorm [localhost:8080/#/vue1] (# is de hash). De modus [history] verwijdert de # [localhost:8080/vue1];
- regel 39: de router wordt geëxporteerd;
13.3. Het hoofdscript [main.js]
Het hoofdscript [main.js] is als volgt:
// importen
import Vue from 'vue'
import App from './App.vue'
// plug-ins
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue);
// bootstrap
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
// router
import monRouteur from './router'
// configuratie
Vue.config.productionTip = false
// projectinstantiëring [App]
new Vue({
name: "app",
// hoofdweergave
render: h => h(App),
// router
router: monRouteur,
}).$mount('#app')
Opmerkingen
- regel 14: de router die door het script [router.js] is geëxporteerd, wordt geïmporteerd;
- regel 25: deze router is doorgegeven als parameter aan de constructor van de klasse [Vue], die de hoofdweergave [App] zal weergeven, gekoppeld aan de eigenschap [router] van de weergave;
13.4. De hoofdweergave [App]
De code van de hoofdweergave is als volgt:
<template>
<div class="container">
<b-card>
<!-- een bericht -->
<b-alert show variant="success" align="center">
<h4>[vuejs-11] : routage et navigation</h4>
</b-alert>
<!-- het huidige routeringsoverzicht -->
<router-view />
</b-card>
</div>
</template>
<script>
export default {
name: "app"
};
</script>
Opmerkingen
- regel 9: geeft de huidige routeringsweergave weer. De tag <router-view> wordt alleen herkend als de eigenschap [router] van de weergave is geïnitialiseerd;
13.5. De opmaak van de weergaven
De opmaak van de weergaven wordt verzorgd door de volgende component [Layout]:
<template>
<!-- regel -->
<div>
<b-row>
<!-- gebied met drie kolommen -->
<b-col cols="2" v-if="left">
<slot name="left" />
</b-col>
<!-- gebied met negen kolommen -->
<b-col cols="10" v-if="right">
<slot name="right" />
</b-col>
</b-row>
</div>
</template>
<script>
export default {
// instellingen
props: {
left: {
type: Boolean
},
right: {
type: Boolean
}
}
};
</script>
We hebben deze opmaak al gebruikt en uitgelegd in het project [vuejs-06] in de paragraaf [vuejs-06].
13.6. De navigatiecomponent
De component [Navigation] biedt de gebruiker een navigatiemenu:

De component die het blok [1] genereert, is de volgende:
<template>
<!-- Bootstrap-menu met drie opties -->
<b-nav vertical>
<b-nav-item to="/vue1" exact exact-active-class="active">Vue 1</b-nav-item>
<b-nav-item to="/vue2" exact exact-active-class="active">Vue 2</b-nav-item>
<b-nav-item to="/vue3" exact exact-active-class="active">Vue 3</b-nav-item>
</b-nav>
</template>
- deze code genereert blok 1 met drie links voor navigatie;
- het attribuut [to] van de <b-nav-item>-tags moet overeenkomen met een van de eigenschappen [path] van de routes in de router van de applicatie;
13.7. De weergaven
Weergave nr. 1 is als volgt:

De zones [3-4] worden gegenereerd door de volgende component [Component1]:
<template>
<Layout :left="true" :right="true">
<!-- navigatie -->
<Navigation slot="left" />
<!-- bericht-->
<b-alert show variant="primary" slot="right">Vue 1</b-alert>
</Layout>
</template>
<script>
import Navigation from './Navigation';
import Layout from './Layout';
export default {
name: "component1",
// gebruikte componenten
components: {
Layout, Navigation
}
};
</script>
Opmerkingen
- regel 2: weergave nr. 1 maakt gebruik van de lay-out van de component [Layout], die bestaat uit twee slots met de naam [left, right];
- regel 4: het navigatiemenu is in de linker slot geplaatst. Dit is het gebied [3] dat hierboven te zien is;
- regel 6: er wordt een bericht in de rechter slot geplaatst. Dit is het gebied [4] dat hierboven te zien is;
Weergaven 2 en 3 zijn vergelijkbaar.
Weergave nr. 2 weergegeven door de component [Component2]:
<!-- weergave nr. 2 -->
<template>
<Layout :left="true" :right="true">
<!-- navigatie -->
<Navigation slot="left" />
<!-- bericht -->
<b-alert show variant="secondary" slot="right">Vue 2</b-alert>
</Layout>
</template>
<script>
import Navigation from './Navigation';
import Layout from './Layout';
export default {
name: "component2",
// componenten van de weergave
components: {
Layout, Navigation
}
};
</script>
Weergave nr. 3 weergegeven door de component [Component3]:
<!-- weergave nr. 3 -->
<template>
<Layout :left="true" :right="true">
<!-- navigatie -->
<Navigation slot="left" />
<!-- bericht -->
<b-alert show variant="info" slot="right">Vue 3</b-alert>
</Layout>
</template>
<script>
import Navigation from "./Navigation";
import Layout from "./Layout";
export default {
name: "component3",
// weergavecomponenten
components: {
Layout,
Navigation
}
};
</script>
13.8. Uitvoering van het project

Bij uitvoering wordt de volgende weergave getoond:

- in [1] is URL gelijk aan [http://localhost:8080]. De volgende routeringsregel is toen uitgevoerd:
{ path: '/', name: 'home', component: Component1 }
Daardoor werd de component [Component1] weergegeven. Deze toont weergave nr. 1, [2]. Laten we nu op de link [Vue 1] klikken, waarvan de code als volgt luidt:
<b-nav-item to="/vue1" exact exact-active-class="active">Vue 1</b-nav-item>
De weergave ziet er nu als volgt uit:
- in [3] is de volgende routeringsregel uitgevoerd:
path: '/vue1', name: 'vue1', component: Component1
Er werd dus opnieuw de component [Component1] weergegeven en daarmee weergave nr. 1 [4]. Laten we nu klikken op de link [Vue 2] met de volgende code:
<b-nav-item to="/vue2" exact exact-active-class="active">Vue 2</b-nav-item>
Het nieuwe scherm ziet er dan als volgt uit:

- in [5] is de volgende routeringsregel uitgevoerd:
path: '/vue2', name: 'vue2', component: Component2
Het is dus de component [Component2] die werd weergegeven, en daarmee weergave nr. 2. Als we nu op de link [Vue 3] klikken, waarvan de code als volgt luidt:
<b-nav-item to="/vue3" exact exact-active-class="active">Vue 3</b-nav-item>
krijgen we de volgende nieuwe weergave te zien:

- in [6] is de volgende routeringsregel uitgevoerd:
path: '/vue3', name: 'vue3', component: Component3
Het is dus de component [Component3] die werd weergegeven, d.w.z. weergave nr. 3 [8].