Académique Documents
Professionnel Documents
Culture Documents
JS
ATELIERS
Table des matières
Ateliers ............................................................................................................................................................................................ 2
Atelier n°1 – Première page et interpollation ............................................................................................................................ 2
Atelier n°2 – Directives ............................................................................................................................................................... 2
Atelier n°3 – Composants ........................................................................................................................................................... 2
Atelier n°4 – Définition de propriétés ........................................................................................................................................ 3
Atelier n°5 – Hooks ..................................................................................................................................................................... 3
Atelier n°6 – Emit ........................................................................................................................................................................ 3
Atelier n°7 – Emit ........................................................................................................................................................................ 3
TP ................................................................................................................................................................................................. 4
1
Cahier d’ateliers et de démonstrations - Formation Vue.JS
Formation GitLab CI/CD, maîtriser la gestion du cycle de vie de vos développements logiciels
Ateliers
Atelier n°1 – Première page et interpollation
2. Votre application doit avoir une propriété dans data appelée restaurantName.
Instructions :
2. Utilisez la directive v-if pour indiquer si un article est "En stock" ou "En rupture de stock".
3. Utilisez la directive v-bind pour rendre dynamiquement chaque image du menu et remplir son texte alt.
4. Utilisez la directive v-on pour augmenter le total du panier lors de l'ajout d'un article du menu avec une fonction
définie dans les méthodes appelées addToShoppingCart.
5. Utiliser v-model pour permettre à l'utilisateur de mettre à jour le nombre d'articles qu'il souhaite mettre lorsqu'il
fait un ajout au panier.
Instructions :
3. Mettez à jour le chemin (path) des images dans simpleMenu pour qu'il soit relatif et non plus absolu (en
supprimant le . qui préfixe l'URL).
2
Cahier d’ateliers et de démonstrations - Formation Vue.JS
5. Utilisez des props pour vous assurer que les données de MenuItem sont toujours correctement rendues et qu'elles
peuvent toujours mettre à jour le total du panier (astuce : vous pouvez transmettre des fonctions dans les props).
Instructions :
1. Utilisez la syntaxe en objet pour définir les propriétés associées à props dans MenuItem.vue.
Instructions :
1. Utilisez un hook de cycle de vie avant que MenuItem ne soit rendu pour vérifier si la date de la journée est paire.
Si c'est le cas, le prix de chaque article devrait être affiché avec une réduction de 10 %.
Instructions :
2. Créez une nouvelle méthode appelée updateShoppingCart dans MenuItem qui émet un événement appelé add-
items-to-cart à Home.vue pour mettre à jour le panier.
Instructions :
Refactorez le composant BaseButton en utilisant des slots plutôt que les props qui sont définies pour le moment.
3
Cahier d’ateliers et de démonstrations - Formation Vue.JS
TP
Avec la feuille de style CSS qui servira de base pour tout le TP : la placer dans le dossier src et l'inclure dans le projet avec
import "./stylesheet.css" dans la partie script de App.vue.
<div id="login-form">
<form>
<h1>Authentification</h1>
<p>Remplissez ce formulaire pour vous connecter.</p>
<hr>
<label for="email"><b>Email</b></label>
<input type="text" placeholder="Entrez votre courriel" id="email" name="email" required>
<label for="psw"><b>Mot de passe</b></label>
<input type="password" placeholder="Entrez votre mot de passe" id="psw" name="psw"
required>
<p><button type="submit">Se connecter</button></p>
</form>
</div>
3. Supprimez le contenu existant du template du composant App.vue, et affichez le composant LoginForm.vue à la place
avec <login-form />.
Vous devrez également déclarer LoginForm dans l'option components du composant App.
4. Complétez le fichier LoginForm.vue pour déclarer le nom du composant, ainsi qu'une option data contenant une
propriété title.
Utiliser ensuite l'interpolation de texte dans le template pour passer le titre du formulaire "Authentification" en
utilisant cette variable title.
5. Sur le formulaire d'authentification, ajoutez deux variables email et password dans l'option data du composant et utilisez
la directive v-model sur les champs email et password pour les lier.
6. Ajoutez une autre variable loggedIn initialement à false, puis utilisez la directive v-on pour l'assigner à true à la
soumission du formulaire.
7. Modifier le comportement par défaut de l'évènement submit du formulaire d'authentification afin d'éviter le
rechargement de la page.
9. Utilisez les directives v-if et v-else pour afficher le formulaire d'authentification et cacher la liste des films quand loggedIn
=== false, et réciproquement.
4
Cahier d’ateliers et de démonstrations - Formation Vue.JS
<ul class="films">
<li class="film card">
<img class="poster" src="https://m.media-
amazon.com/images/M/MV5BMDdmZGU3NDQtY2E5My00ZTliLWIzOTUtMTY4ZGI1YjdiNjk3XkEyXkFqcGdeQXVyNTA4NzY1MzY@._
V1_SX300.jpg" />
<p class="title">
Titanic
<span class="rating">★★★★</span>
</p>
<dl>
<dt>Release date</dt><dd>07/01/1998</dd>
<dt>Director</dt><dd>James Cameron</dd>
<dt>Actors</dt><dd>Leonardo DiCaprio, Kate Winslet, Billy Zane, Kathy Bates</dd>
</dl>
<p class="plot">
84 years later, a 100 year-old woman named Rose DeWitt Bukater tells the story to her granddaughter Lizzy Calvert, Brock
Lovett, Lewis Bodine, Bobby Buell and Anatoly Mikailavich on the Keldysh about her life set in April 10th 1912, on a ship called
Titanic when young Rose boards the departing ship with the upper-class passengers and her mother, Ruth DeWitt Bukater, and her
fiancé, Caledon Hockley. Meanwhile, a drifter and artist named Jack Dawson and his best friend Fabrizio De Rossi win third-class
tickets to the ship in a game. And she explains the whole story from departure until the death of Titanic on its first and last voyage
April 15th, 1912 at 2:20 in the morning.
</p>
</li>
</ul>
5
Cahier d’ateliers et de démonstrations - Formation Vue.JS
11. A l'aide de la directive v-for, répétez l'élément .film.card pour afficher autant de films que contient la liste films
12. Complétez les données des cartes par celle de chaque film en utilisant les directives et l'interpolation
13. Bonus : trouvez comment utiliser la propriété metascore pour afficher un certain nombre d'étoiles à côté de chaque
titre de film.
Instructions :
1. Sauvegardez temporairement le contenu de App.vue dans un fichier séparé car il sera écrasé par l'installation.
2. Ajoutez le plugin vue-router à l'application et n'activez pas le mode historique lors de l'installation (Use history
mode for router? => N).
3. Migrez les données temporairement sauvegardées de l'ancienne App.vue vers Home.vue
4. Créez une route statique pour la page de contact à l'url /contact
5. Migrez les coordonnées de Home.vue vers Contact.vue
6. Ajoutez le lien du routeur de contact à App.vue
7. Activez le mode historique dans la configuration de votre routeur.
TP (Suite)
1. Refactorez le code existant en créant un composant Film.vue servant à afficher les détails d'un film. Ajoutez des
props pour passer les données de chaque film au composant.
2. Créer un autre composant SearchFilm.vue contenant un formulaire de recherche ainsi que la liste de Film en
résultats dessous :
<template>
<div id="search-film">
<form>
<label for="search">Rechercher :</label>
<input id="search" type="text">
</form>
<ul class="films">
<!-- la liste de <Film> -->
</ul>
</div>
</template>
3. Insérez ce composant SearchFilm aux côtés de LoginForm dans App.vue et déplacez les data et autres options
associées dans les sous-composants pour alléger au maximum le code de App.
5. Assignez la variable films à une liste vide [] initialement. A la soumission du formulaire de recherche, lancez une
méthode searchFilms qui mettra les 3 films d'exemple dans cette liste.
6. Bonus : Dans la méthode searchFilms, au lieu de mettre tous les films d'un coup dans this.films, essayez de les
assigner un à un de cette façon :
this.films[0] = { title: 'Titanic', released: '19 Dec 1997', ... }
this.films[1] = { title: 'Blade Runner', ... }
this.films[2] = ...
Question : Pourquoi la vue ne se met-elle plus à jour alors que la liste semble être remplie correctement ?
6
Cahier d’ateliers et de démonstrations - Formation Vue.JS
7. Si ce n'est pas déjà fait, installez vue-router sur votre projet avec la commande vue add router. Ouvrez ensuite le
fichier src/router.js pour voir comment sont déclarées les routes.
8. Ajouter une route /login reliée à la view LoginForm et une route /search reliée à SearchFilm.
9. A l'aide de la documentation de vue-router, remplacez la bascule entre LoginForm et SearchFilm à base de v-if par
une navigation d'une route à une autre.
10. Bonus : en utilisant les Navigation Guards de vue-router, redirigez l'utilisateur voulant accéder à la page de
recherche de films vers /login si l'utilisateur n'est pas authentifié.
Instructions :
1. Évaluez le state actuel de l'application et déterminez où se trouvent les différentes propriétés des données.
Atelier n° 10 – Vuex
Reprendre le support d’exercice fourni (P4C2)
Instructions :
Instructions :
7
Cahier d’ateliers et de démonstrations - Formation Vue.JS
2. Créer un store Vuex en créant un fichier src/store.js avec le contenu slide suivant.
3. Déclarez le store dans votre application en complétant le fichier main.js comme ceci :
Vue.use(Vuex)
4. Dans le code de l'application, supprimez les passages de prop loggedIn de composant à composant et récupérez la
donnée depuis le store à la place (this.$store.state.loggedIn)
8
Cahier d’ateliers et de démonstrations - Formation Vue.JS
5. Dans LoginForm.vue, lors du submit, vérifier si l'utilisateur a entré l'adresse mail test@test.com et le mot de passe
test1234. Si c'est le cas, déclencher l'action login pour le user test.
6. Se connecter avec les identifiants cités ci-haut, vérifier que l'on bascule bien sur le formulaire de recherche de
films, puis actualiser la page.
7. Si l'utilisateur a entré de mauvaises informations, afficher un message d'erreur. Pour cela, vous pouvez vous aider
d'une data supplémentaire comme une String loginError par exemple.
8. Bonus : Coder une action logout et ajouter un bouton de déconnexion <button id="logout-btn"> qui invoque cette
action. Afficher le nom de l'utilisateur à côté de ce bouton.
Exemple : Utilisation d'une API fournie par un serveur (le back-end) pour authentifier les utilisateurs et rechercher des films.
Ce back-end a déjà été développé et déployé sur Heroku.
https://dev.to/anjolaogunmefun/deploy-vue-js-projects-to-heroku-1hb5
1. Créer un service générique services/api.js permettant d'appeler le backend, avec le contenu slide suivant.
Remarque : Il n'y a pas de code spécifique à Vue ici, il s'agit d'une fonction utilitaire autour de la méthode fetch branchée
sur notre back-end.
✓ Les autres options servent à configurer le cache HTTP et les autorisations cross-origin à appliquer.
9
Cahier d’ateliers et de démonstrations - Formation Vue.JS
params.headers = Object.assign({
Authorization: `Bearer ${store.state.token}`,
'Content-Type': 'application/json'
}, params.headers)
2. Créer un service services/UserService.js qui exploitera les endpoints de l'API concernant l'inscription et le login des
utilisateurs :
export default {
register (credentials) {
return api('/user/register', {
method: 'POST',
body: JSON.stringify(credentials)
})
},
login (credentials) {
return api('/user/login', {
method: 'POST',
body: JSON.stringify(credentials)
})
},
user () {
return api('/user')
}
}
10
Cahier d’ateliers et de démonstrations - Formation Vue.JS
3. Dans le composant LoginForm, ajoutez un second bouton pour s'inscrire à côté de celui pour se login, puis modifiez
les méthodes de LoginForm pour appeler les méthodes du UserService :
export default {
methods: {
async register () {
try {
const response = await UserService.register({
email: this.email,
password: this.password,
firstname: 'John',
lastname: 'Smith'
})
this.$store.dispatch('login', { user: response.user, token: response.token })
this.$router.push('/search')
} catch (error) {
this.error = error.toString()
}
XX },
async login () {
try {
const response = await UserService.login({ email: this.email, password: this.password })
this.$store.dispatch('login', { user: response.user, token: response.token })
this.$router.push('/search')
} catch (error) {
this.error = error.toString()
}
}
}
}
4. Notez qu'en cas d'erreur, on stocke le message d'erreur retourné dans une variable error. Déclarez cette variable
dans les data du composant et utilisez-là dans le template pour afficher le message d'erreur en cas d'échec
d'authentification.
5. Notez également que la réponse du back-end au login contient un token permettant d'authentifier l'utilisateur, qui
est transmis au store dans les paramètres de l'action login. Modifiez store.js pour stocker ce token dans le store, en
ajoutant une mutation setToken appelée par l'action login.
6. Le service api est déjà configuré pour ajouter ce token en header Authorization des requêtes. Vérifiez que le token
est bien envoyé en header HTTP via les outils développeur de votre navigateur.
7. Bonus : Modifier l'action logout du store pour supprimer le token et les infos utilisateur du store à la déconnexion,
et rediriger vers le formulaire de login.
8. Créez un service FilmService avec une méthode pour rechercher les films, en suivant la documentation de l'API (GET
/movies/search).
9. Modifier la page de recherche de films pour appeler le back-end et permettre à l'utilisateur d'entrer le nom d'un
film, et d'avoir tout le détail de ce film en sortie.
1. Créer un fichier de spec de tests unitaires pour tester votre composant Film.vue.
2. Dans votre test, monter le composant, ajouter une assertion basique et lancer les tests.
3. Simuler les valeurs d'un film et vérifier le rendu HTML.
4. Ajouter le calcul de la couverture de code. Que constatez-vous ?
5. Bonus : Tester le composant LoginForm.vue, en simulant les appels externes HTTPS ainsi que les appels au store et
au routeur. Tester le cas nominal et d'erreur du login.
11
Cahier d’ateliers et de démonstrations - Formation Vue.JS
Atelier n° 12 – Animations
Sur une simple page HTML, insérer des transitions pour animer l’ajout ou la suppression d’item dans la liste dans un menu
comme sur cette copie écran :
Atelier n° 13 – Mixins
Reprendre le support d’exercice fourni (P3C1)
Instructions :
1. Migrez tous les styles des sites statiques styles.css dans les fichiers des composants respectifs.
2. Utilisez votre préprocesseur préféré si vous le souhaitez !
12