Cours 1: introduction à Vue.js
Cours 2: Style (Bulma & class-binding)
Cours 3: Client-side routing
Cours 4: Rest, promises, ouverture
Application pour visualiser les composteurs sur l'agglo nantaise
npm install -g @vue/cli
Vue CLI offre des commandes pour facilement créer des projets Vue et les maintenir
vue create compostmap
cd compostmap
npm run serve
L'application est disponible sur http://localhost:8080/ (ou un autre port si occupé)
Pour spécifier un port particulier, modifiez la tâche "serve" dans le package.json ou
npm run serve -- --port 8072
public/index.htmlhtml contenant la div #appsrc/App.vue composant principal Appsrc/main.js injecte App dans #appsrc/assets/ dossier images,fichierssrc/components/ sous-composantspublic/index.htmlhtml contenant la div #app<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport"
content="width=device-width,initial-scale=1.0">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but
<%= htmlWebpackPlugin.options.title %>
doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
src/App.vue composant principal App
src/main.js injecte le composant App dans #appimport { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
public/index.htmlhtml contenant la div #appsrc/App.vue composant principal Appsrc/main.js injecte App dans #appsrc/assets/ dossier images,fichierssrc/components/ sous-composants
Bienvenue sur mon app {{ msg }}
Une prop peut être affichée avec la syntaxe {{nomDeMaProp}}
Bienvenue sur mon app {{ title }}
Une data peut être affichée avec la syntaxe {{nomDeMaProp}}
Bienvenue sur mon app {{ title }}
On reviendra sur la notion de DOM plus tard, pour l'instant quand je parle de "DOM" dites-vous "la page affichée à l'utilisateur"
HelloWorld.vue<button v-on:click="title += '$';subtitle += '€';"> Modifier</button>
Bienvenue sur mon app {{ title }}
data {
title: "Compostmap"
} Bienvenue sur mon app {{ title }}
data {
title: "Modified from data"
}
Binding js → DOM : Bienvenue sur mon app {{ title }}
data {
title: "Modified from data"
}
Bienvenue sur mon app {{ title }}
data {
title: "Modified from data"
}
Bienvenue sur mon app {{ title }}
data {
title: "Modified from DOM"
}
Le Reactivity System de Vue est complexe et intéressant à étudier (création d'un DOM virtuel, algorithmes de différenciations... ) mais pour l'heure cette notion de binding bi-directionnel nous suffira.
Créons un composant en charge d'afficher un composteur
Compost {{ id }}
Adresse: {{ adresse }}
→ Comment associer la data 'image' avec le src de l'img ?
→ Comment associer la data 'image' avec le src de l'img ?
→ Grâce à la directive v-bind
![]()
→ Grâce à la directive v-bind
v-bind créé un lien entre :
-un attribut (ici l'attribut "src" de l'élément img)
- une expression (ici la data "image")
grâce au principe de réactivité (binding bi-directionnel) de Vue,
- si l'expression (ici la data 'image') change de valeur,
- Vue va détecter et propager ce changement
- l'attribut src sera mis à jour avec la nouvelle valeur de l'expression
commit : Bind example: image src
npm install puis npm run serve
Le binding bi-directionnel de Vue, permet, quand les data changent :
Bienvenue sur {{ title }}![]()
Les développeurs sont des faignants (ce n'est pas nouveau), aussi trouverez-vous une syntaxe alternative à v-bind :
![]()
est strictement identique à
![]()
Utilisez celle qui vous parle le plus
Une besoin courant est d'effectuer ou non le rendering d'éléments du template en fonction d'une condition.
Par exemple: si l'adresse contient le texte 'Nantes', afficher un message dédié
C'est l'objectif de la directive v-if
C'est l'objectif de la directive v-if:
conditionner le rendering d'un élément à la valeur d'une expression
Adresse: {{ adresse }}
Situé à Nantes !
commit : v-if example
On peut utiliser v-else pour effectuer un rendering alternatif
Adresse: {{ adresse }}
Situé à Nantes !
<p v-else>Situé à Toulouse (Chocolatine power)</p>
On peut utiliser v-else-if pour enchaîner les if puis finir par un v-else
Adresse: {{ adresse }}
Situé à Nantes !
Situé à Toulouse (Chocolatine power)
<p v-else>Situé quelque part
Imaginons que chaque compost dispose d'une liste de responsables :
data() {
return {
responsables: [
{
first_name: "Alex",
last_name: "Morel",
},
{
first_name: "Amandine",
last_name: "Lagarde",
},
{
first_name: "Pascal",
last_name: "André",
},
],
}
}
Comment effectuer le rendu de cette liste dans notre template?
Essayons l'approche naïve: utilisons {{ responsables }} comme on l'aurait fait pour une chaîne de caractères ou un nombre
{{ responsables }}
commit : String array: naive approche
Ce que l'on veut faire: créer un élément dans le DOM pour chaque élément de notre collection
C'est l'utilité de la directive v-for
- {{ responsable.first_name }} {{ responsable.last_name }}
v-for attend une collection à afficher et une key(clé)
v-for attend une collection à afficher et une key(clé)
- {{ responsable.first_name }} {{ responsable.last_name }}
La key est utilisé par le mécanisme de réactivité pour identifier de manière unique chaque élément du DOM ainsi créé
→ Permet d'optimiser les performances du refresh quand la collection change (on ne change dans le DOM que ce qui a bougé dans la data)
→ Cette key est également utilisée par Vue dans d'autres contextes (animations...)
Plutôt qu'afficher chaque élément dans un <p>, quel balise html pourrait-on utiliser ?
<ul> et itérer sur chaque <li>
{ day: 'Lundi', opening_hour: 9, closing_hour: 12}
Grace à v-bind, v-if et v-for, nous sommes maintenant capable d'effectuer le rendu de nos data/props sur la page.
On souhaiterait maintenant pouvoir intercepter les Event html pour définir de la logique sur les interactions utilisateurs.
Avez-vous des exemples d'events html ?
on-click, on-mouse-over, oncopy, oninput... liste complète
On veut donc écouter et réagir aux évènements html (onClick, onMouseOver, OnInput...)
C'est l'utilité de la directive v-on
v-on prend en paramètres un évènement (click, mouseover, input...) et du code à exécuter
v-on prend en paramètres un évènement (click, mouseover, input...) et du code à exécuter
Il est bien sûr possible d'appeler une méthode du composant avec la syntaxe suivante :
commit : V-on : method example
Les développeurs sont des faignants (édition 2), aussi trouverez-vous une syntaxe alternative à v-on :
![]()
est strictement identique à
![]()
Utilisez celle qui vous parle le plus
On est maintenant capable de
{{ maProp }} v-bind:href="maProp" ou
:href="maProp"v-if,v-elseif et v-elsev-for="e in array" v-bind:key="e.id">v-on:click="method" ou @click="method"On est maintenant capable de
{{ maProp }} v-bind:href="maProp" ou
:href="maProp"v-if,v-elseif et v-elsev-for="e in array" v-bind:key="e.id">v-on:click="method" ou @click="method"Qu'est ce qu'il manque à notre application pour être montrable ?
😎 Du style (parce que là c'est affreux)
⌛ Un peu de pratique (créer nos propres composants)
☰ Un menu et une structure en différentes pages
Ce sera l'objectif du prochain cours