3. project [vuejs-01]: de basis
Om de code die in [vuejs-00] wordt uitgevoerd te verklaren, gaan we deze vereenvoudigen in [vuejs-01]. We dupliceren de map [vuejs-00] in [vuejs-01]:

Het project [vuejs-01] bestaat in wezen uit vier bestanden:
- [main.js] [2] is het startpunt van het project;
- [App.vue, HelloWorld.vue] en [3-4] zijn componenten van [Vue.js], die optioneel de volgende elementen bevatten:
- [<template>...</template>]: code HTML;
- [<script>...</script>]: de JavaScript-code die bij de code HTML hoort;
- [<style>...</style>]: de stijl CSS die bij de code HTML hoort;
- [public/index.html] [5]: het document HTML dat wordt weergegeven door de opdracht [npm run serve];
Het bestand [public/index.html] dat bij het uitvoeren van het project wordt weergegeven, is dit:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>vuejs</title>
</head>
<body>
<noscript>
<strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- opgebouwde bestanden worden automatisch ingevoegd -->
</body>
</html>
Dit bestand HTML geeft dus statisch gezien niets weer. Er is hier geen code HTML. De weergave is dynamisch: de code jS van het project genereert HTML, dat de tag [<div id=’app’>] op regel 14 volledig vervangt. De code HTML, die wordt gegenereerd door de projectcode jS en wordt ingevoegd in plaats van de tag [<div>] op regel 14, is afkomstig van de tags [template] van de componenten [vue.js], waarbij de bestanden de extensie [.vue] hebben.
De code HTML wordt dynamisch ingevoegd in regel 14 door het volgende script [vuejs-01/main.js]:
// imports
import Vue from 'vue'
import App from './App.vue'
// configuratie
Vue.config.productionTip = false
// projectinstantiëring [App]
new Vue({
render: h => h(App),
}).$mount('#app')
Opmerkingen
- regel 2: het object [Vue] wordt geleverd door het framework [vue.js];
- regel 3: het object [App] wordt geleverd door het bestand [vuejs-01/App.vue];
- regel 6: configuratie van het object [Vue];
- regels 9-11: dit zijn de regels die:
- de code HTML van de applicatie genereren. Regel 10: het bestand [App.vue] genereert deze code;
- de in regel 10 gegenereerde code HTML laden in de sectie [<div id=’app’></div>] van het bestand [public/index.html];
Elk project [Vue.js] kan het bestand [index.html] ongewijzigd laten.
Het bestand [App.vue] van het oorspronkelijke project [vuejs-00] wordt in het project [vuejs-01] als volgt vereenvoudigd:
<template>
<div id="myApp">
<img alt="Vue logo" src="./assets/logo.png" />
<HelloWorld msg="Notre première application Vue.js" />
</div>
</template>
<script>
import HelloWorld from "./components/HelloWorld.vue";
export default {
name: "app",
components: {
HelloWorld
}
};
</script>
Opmerkingen
- een fragment [.vue] bestaat uit maximaal drie secties:
- [<template>...</template>]: de code HTML;
- [<script>...</script>]: de JavaScript-code die bij de code HTML hoort;
- [<style>...</style>]: de stijl CSS die bij de code HTML hoort;
Hier hebben we geen sectie [style].
- regels 1-6: de code HTML van het fragment (pagina, component, weergave, ...);
- regels 2-5: de sectie [template] mag slechts één element bevatten. Meestal wordt er een sectie [div] geplaatst die het gehele HTML van het fragment omvat. Er kan ook een <template>-tag worden geplaatst;
- regel 3: een afbeelding;

- regel 4: een component met de naam [HelloWorld]. Het principe van [Vue.js] is het bouwen van webpagina’s met behulp van fragmenten die zijn gedefinieerd in [.vue]-bestanden, zoals hier [App.vue]. Deze component wordt gedefinieerd door het bestand [HelloWorld.vue], zoals gedefinieerd op regel 9 van het bijbehorende script jS;
- regel 4: een component kan parameters accepteren. De parameter is hier het attribuut [msg];
- regels 8-17: het script jS van het fragment (of de component);
- regel 9: om de component [HelloWorld] in de component [App] te kunnen gebruiken, moet de definitie ervan worden geïmporteerd in het gedeelte [script];
- regels 11-16: het script definieert een object en exporteert dit om het extern beschikbaar te maken;
- regel 12: het attribuut [name] definieert de naam van de geëxporteerde component;
- regels 13-15: het attribuut [components] somt de componenten op die door de component [App] worden gebruikt. Deze worden samen met de component geëxporteerd;
Regel 9: de component [HelloWorld] hoeft niet dezelfde naam te hebben als het bestand waarin deze is gedefinieerd. Deze zou kunnen worden geïmporteerd als [X] en geëxporteerd als component [Bonjour]:

- regel 14: de component [X] wordt geëxporteerd onder de naam [Bonjour]. Deze wordt vervolgens onder die naam gebruikt, regel 4;
De eerste versie komt het meest voor, dus zullen we onze componenten op deze manier definiëren;
<template>
<div id="myApp">
<img alt="Vue logo" src="./assets/logo.png" />
<HelloWorld msg="Notre première application Vue.js" />
</div>
</template>
<script>
import HelloWorld from "./components/HelloWorld.vue";
export default {
name: "app",
components: {
HelloWorld
}
};
</script>
Regel 14 is een afkorting voor de code [HelloWorld : HelloWorld]: de component [HelloWorld] (rechts, geïmporteerd op regel 9) wordt geëxporteerd onder de naam [HelloWorld] (links).

We vereenvoudigen de component [HelloWorld.vue] als volgt:
<template>
<div>
<h1>{{ msg }}</h1>
</div>
</template>
<script>
export default {
name: "HelloWorld",
props: {
msg: String
}
};
</script>
Opmerkingen
- de component [HelloWorld] heeft dezelfde bestandsstructuur als de hoofdcomponent [App];
- regel 3: hier vindt een evaluatie van een JavaScript-uitdrukking plaats, in dit geval de uitdrukking [msg];
- regels 10-12: hierin worden de eigenschappen van de component gedefinieerd, meer bepaald de parameters ervan. Toen de component [App] een instantie van de component [HelloWorld] aanmaakte, gebeurde dit met de volgende syntaxis:
<HelloWorld msg="Notre première application Vue.js" />
De component [HelloWorld] wordt geïnstantieerd door een waarde toe te kennen aan de parameter (attribuut) [msg]. Als we de [template] van de component [HelloWorld] volgen, wordt deze:
<div>
<h1>Notre première application Vue.js</h1>
</div>
- regels 7-14: de eigenschappen van de component, gedefinieerd in de vorm van een object dat wordt geëxporteerd;
- regel 9: de component wordt geëxporteerd onder de naam [HelloWorld];
- regels 10-12: de parameters ervan worden gedefinieerd door de eigenschap [props];
Als we ten slotte de sjablonen van de twee gebruikte [App, HelloWorld]-componenten samenvoegen, ziet het weergegeven bestand [index.html] er als volgt uit:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>vuejs</title>
</head>
<body>
<noscript>
<strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="myApp">
<img alt="Vue logo" src="./assets/logo.png" />
<div>
<h1>Notre première application Vue.js</h1>
</div>
</div></body>
</html>
We starten de toepassing door de opdracht [serve] [1] in het bestand [package.json] aan te passen:

De weergegeven pagina is dan [2].
Laten we nu eens kijken naar de code van deze pagina:

- in [1], verander in [clic droit];
- in [2], de broncode van de pagina. We zien dat dit de code is van het oorspronkelijke bestand [index.html] en dat is niet wat er is weergegeven. Het is inderdaad de pagina [index.html] die aanvankelijk is geladen. Vervolgens heeft JavaScript deze pagina dynamisch gewijzigd, maar dat wordt ons niet getoond;
Wanneer pagina’s dynamisch door JavaScript worden gegenereerd, heeft de optie [2] geen zin. Je moet naar de browsertools gaan (F12 in Firefox) om de code van de momenteel weergegeven pagina te bekijken:

- in [1], de inspecteur van het Document Object Model (DOM) van het weergegeven document;
- in [2], wat er werkelijk in dit DOM staat;
- [3-4], de tools die we zullen gebruiken om de JavaScript-objecten weer te geven die door het framework [Vue.js] worden gebruikt;
- [4] is een extensie (in dit geval voor Firefox) om [Vue.js]-toepassingen te debuggen:
- voor Firefox: [https://addons.mozilla.org/fr/firefox/addon/vue-js-devtools/];
- voor Chrome: [https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd];
Laten we het tabblad [Vue] [4] eens bekijken:

De weergave [1-4] toont ons de structuur [Vue.js] van het document: de root van het document [2] (index.html) bevat de component [App] (3), die op zijn beurt de component [HelloWorld] (4) bevat. Als u op [4] klikt, verschijnen de eigenschappen van de componenten [HelloWorld] en [5].
In [4] (rechts) is de indicator [$vm0] te zien. Dit is de naam van de variabele die we in de console JavaScript [6] kunnen gebruiken om het object [HelloWorld] aan te duiden. Laten we dat eens doen:

- in [2] laten we de uitdrukking [$vm0] evalueren, waardoor de structuur ervan wordt weergegeven. Normaal gesproken hoeven we deze structuur niet rechtstreeks te gebruiken;
Laten we afsluiten door te laten zien hoe [hot reload] de opdracht [serve] kan gebruiken om het project uit te voeren:
- wijzig in [App.vue] het bericht dat door [HelloWorld] wordt weergegeven:

- in [1] wordt het weergegeven bericht gewijzigd;
- in [2-3] wordt de pagina automatisch bijgewerkt zonder dat we daar iets voor hoeven te doen;
We gaan nu verschillende projecten [vuejs-xx] aanmaken om de belangrijke punten van [Vue.js] te illustreren. Met ‘belangrijk’ bedoelen we ‘dat we deze zullen gebruiken in de client [vue.js] van de belastingberekeningsserver’. Andere ‘belangrijke’ punten zullen buiten beschouwing worden gelaten als ze niet in de client worden gebruikt. Er wordt dus geen uitputtende presentatie van [vue.js] gegeven.