Grégory Bourguin
SysReIC - LISIC - ULCO
Vues.js - Les Bases

Introduction

Qu'est-ce que Vue.js ?

Vue.js est un framework permettant de créer des interfaces utilisateur web (HTML, CSS, Javascript/TypeScript), en adoptant une approche orientée composants.

Il est en général utilisé pour créer des applications web monopage aussi appelées Single-Page Application (SPA). Les SPA se distinguent des pages web classiques dans le sens où elles permettent de fournir à l'utilisateur une interface telle qu'on la trouverait dans une application "de bureau" : les interactions avec la SPA se font sans rechargement global de la page web.

Pourquoi utiliser un tel Framework ?

Tout d'abord parce que les applications web modernes sont en général proposées aux utilisateurs sous forme de SPA, et Vue.js facilite grandement la création de telles applications.

D'une manière générale, Vue.js facilite la mise en place de mécanismes qui sont souvent plus lourds à réaliser en Javascript / JQuery.

Prenons un exemple : vous qui êtes maintenant des pros du Javascript (cf. super_cours), essayez de réaliser une page contenant l'exemple ci-dessous en Javascript (sans Vue.js).

Resultat

{{ name_01 }}

Nickname : {{ name_01}} The Terrible

Mail : {{name_01}}@truc.fr

Fiche de {{ name_01 != '' ? name_01 : '???' }}

Spoiler: avec Vue.js, c'est bcp plus simple :))

Documentation

Il serait impossible (et inutile) de vous présenter ici tous les détails de Vue.js.
Ce cours n'est donc qu'une introduction aux principales fonctionnalités...
Vous pouvez trouver toute la documentation officielle sur https://v3.vuejs.org/

Exercices

Create app

Notions Requises

Creating a Vue Application

Énoncé

Créer une application Vue de type SFCs (Single-File Components).

Supprimer les composants générés et remplacer par ex01_app.vue.

ex01_app
<template>
<div class="ex01-app">
    <h1>HELLO WORLD</h1>
</div>
</template>

<style scoped>
.ex01-app {
    width: 100%;
    height: 100%;

    display: flex;
    align-items: center;
    justify-content: center;
}
</style>
ex01_app.vue

Mustach

Notions Requises

Text Interpolation

Énoncé

Créez un composant qui à partir de la déclaration :

const message = "HELLO WORLD"
... affiche la page suivante (sans utiliser de ref() ou reactive():
ex02_mustach.vue

Ref & Reactive

Notions Requises

Reactivity Fundamentals

Énoncé

Créez un composant qui à partir de la déclaration :

    const message = ref()
    const time = reactive({
        hours: "??",
        minutes: "??",
        seconds:"??"
    })
... affiche la page suivante :
ex03_ref_reactive.vue

Events

Notions Requises

Event Handling

Énoncé

Créez un composant qui à partir de la déclaration :

    const time = reactive({
        hours: "??",
        minutes: "??",
        seconds:"??"
    })
... affiche la page suivante (attention aux messages du bouton) :
ex04_event.vue

Class & Style

Notions Requises

Class and Style Bindings

Énoncé

Transformer l'exercice précédent pour qu'il permette un Start/Stop classieux !

ex05_class_v1.vue

Puis (SANS v-if et v-show) :

ex05_class_v2.vue

If & Show

Notions Requises

Conditional Rendering

Énoncé

  • Réalisez la page suivante avec v-if.
ex06_if.vue
  • Réalisez ensuite une seconde version avec v-show.
  • Faites ensuite une 3ème version sans v-if ou v-show, mais avec une classe dynamique qui simule ce que fait en réalité v-show.

Form Inputs

Notions Requises

Form Input Bindings

Énoncé

Recréez les composants suivants.

ex07_input.vue
ex08_checkbox.vue
ex09_checkbox_style.vue
ex10_style_global.vue
ex11_style_attr.vue

Computed

Notions Requises

Computed Properties

Énoncé

Réalisez la page suivante avec computed : type indique si message est plus court/long que la valeur de shortLimit.

ex12_computed.vue

For

Notions Requises

List Rendering

Énoncé

A partir de la déclaration :

const weather_forecasts = [
    { day: 'monday', weather: 'fog'},
    { day: 'tuesday', weather: 'clouds'},
    { day: 'wednesday', weather: 'rain'},
    { day: 'friday', weather: 'storm'},
    { day: 'sunday', weather: 'armageddon'},
    { day: 'thursday', weather: 'ice'},
    { day: 'saturday', weather: 'snow'},
]

Créez le composant ex13_for.vue qui affiche les prévisions météo comme ci-après.

  • Un click sur le bouton More Sun ensoleille la prévision météo d'un jour pris au hasard parmi les jours qui n'ont pas encore de soleil (!).
    (En d'autres termes, il ne doit pas y avoir de click 'blanc', c'est à dire qu'on ne doit pas tenter de mettre du soleil dans un jour déjà ensoleillé).
  • La prévision d'un jour ensoleillé se pare d'une magnifique couleur doréé.
  • Lorsque tous les jours ont été ensoleillés, le bouton More Sun doit être désactivé.

Conseil : pensez Vue.js !

ex13_for.vue

Énoncé

En utilisant le fichier sample_countries.js , réalisez la page ci-dessous.

import { countries } from "../js/sample_countries.js"; // NB: mettre votre chemin
ex14_for_index.vue

Watch (+tpl ref)

Notions Requises

Watchers

Énoncé

Dans ex15_watch_tmpl_ref.vue, les watchers sont utilisés pour :

  • Rendre les propriétés kg et g interdépendantes, c.a.d. que la modification de l'une, entraine la mise à jour de l'autre : il ne s'agit donc pas de faire un computed "classique" car la dépendance qui nous intéresse ici est bidirectionnelle.
    (NB: ...bon ...il serait en fait possible de le faire avec un computed + des accesseurs, mais ce n'est pas le sujet ici ;) ).
  • Déclencher l'apparition d'un message (uniquement) lorsque la valeur de la propriété message (qui est lui-même computed !) a changé.
    La valeur de message est calculée comme suit :
    return kg.value < 100 ? "Trop léger..." : "Wow, c'est lourd !"

    ATTENTION : Le "flash" (apparition/disparition) du message doit être ici (pour le fun) réalisé sans utiliser une bibliothèque comme JQuery, en récupérant dynamiquement la référence sur l'élément HTML (cf. Template Reference) qui contient le message, puis en faisant varier son opacity.

ex15_watch_tmpl_ref.vue

Lifecycle

Notions Requises

Lifecycle Hooks

Énoncé

Créez la démo ci-dessous qui utilise la classe Modal de Bootstrap.

La création d'un objet de type Modal nécessite de récupérer l'élément html qui définit le contenu de la boite de dialogue.

On ne peut récupérer un élément html avant que la page ne soit complètement chargée (ou on risque de récupérer un élément vide).

La solution consiste ici à récupérer l'élément html de la boite de dialogue (et créer l'instance de Modal) seulement après le chargement du composant vue, c'est à dire dans la méthode onMounted.

ex16_mounted_modal.vue

TP01

Énoncé

Réalisez le composant ci-dessous (pour l'instant en 1 seul gros composant).

Quelques remarques à prendre en compte :

  • Testez bien tout pour voir ce qu'il faut faire !
  • J'ai bloqué le pays à "France" pour être cohérent avec le format du Téléphone, mais j'utilise le tableau fourni dans sample_countries.js.
  • Mettez bien en place la gestion des erreurs (couleur rouge + messages sous les inputs) !
  • Vous remarquerez que le bouton "Enregistrer" est désactivé tant que tous les champs ne sont pas correctement remplis.
  • Lors du click sur "Enregistrer", j'ai utilisé une boite de dialogue Modal de Bootstrap.

  • J'ai utilisé .replaceAll(...), .trim(), .substring(...) et RegExp pour faire les vérifications / transformations.
  • J'ai "abusé" des propriétés computed.
  • J'ai utilisé un watch pour empêcher d'entrer plus de 9 caractères dans le téléphone (espaces non compris).
  • Pour la photo d'identité j'ai installé et utilisé Bootstrap Icons.
  • Fichiers : sample_countries.js,

tp01.vue