Séance 1 : Introduction & rappel Vue

🎯 Objectifs

  • Vérifier et réactiver les acquis de BUT2.

  • Mettre en place un projet clean (environnement, conventions).

📖 Partie théorique

Directives Vue et structure de projet

Directives Vue de base

Les directives sont des attributs spéciaux avec le préfixe v- qui appliquent un comportement réactif au DOM.

<template>
  <div>
    <!-- v-if : affichage conditionnel -->
    <p v-if="user.isLoggedIn">Bienvenue {{ user.name }} !</p>
    <p v-else>Veuillez vous connecter</p>
    
    <!-- v-show : visibilité conditionnelle (CSS display) -->
    <div v-show="showDetails" class="details">Détails supplémentaires</div>
    
    <!-- v-for : boucles -->
    <ul>
      <li v-for="task in tasks" :key="task.id">
        {{ task.title }} - {{ task.status }}
      </li>
    </ul>
    
    <!-- v-model : liaison bidirectionnelle -->
    <input v-model="searchQuery" placeholder="Rechercher...">
    <p>Recherche : {{ searchQuery }}</p>
    
    <!-- v-bind (:) : liaison d'attributs -->
    <button 
      :class="{ active: isActive, disabled: isDisabled }"
      :disabled="isDisabled"
      @click="toggleActive"
    >
      {{ isActive ? 'Actif' : 'Inactif' }}
    </button>
    
    <!-- v-on (@) : gestion d'événements -->
    <button @click="handleClick" @keyup.enter="handleEnter">
      Cliquer ou Entrée
    </button>
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'

const user = reactive({
  isLoggedIn: true,
  name: 'Alice'
})

const showDetails = ref(false)
const searchQuery = ref('')
const isActive = ref(false)
const isDisabled = ref(false)

const tasks = ref([
  { id: 1, title: 'Tâche 1', status: 'En cours' },
  { id: 2, title: 'Tâche 2', status: 'Terminée' }
])

const toggleActive = () => {
  isActive.value = !isActive.value
}

const handleClick = () => {
  console.log('Bouton cliqué')
}

const handleEnter = () => {
  console.log('Entrée pressée')
}
</script>

Rappel Vue 3 : Composition API

ref() - Réactivité pour les primitives

ref() crée une référence réactive pour les valeurs primitives (string, number, boolean).

reactive() - Réactivité pour les objets

reactive() rend un objet entièrement réactif, toutes ses propriétés deviennent réactives.

computed() - Propriétés calculées

computed() crée des valeurs dérivées qui se mettent à jour automatiquement quand leurs dépendances changent.

watch() - Surveillance des changements

watch() permet d'exécuter du code quand une valeur réactive change.

Cycle de vie des composants

Les hooks de cycle de vie permettent d'exécuter du code à des moments précis de la vie du composant.

Props, emits et slots

Props - Transmission de données du parent vers l'enfant

Les props permettent de passer des données du composant parent vers le composant enfant.

Emits - Remontée d'événements de l'enfant vers le parent

Les emits permettent au composant enfant de notifier le parent d'un événement.

Slots - Injection de contenu personnalisé

Les slots permettent de créer des composants avec du contenu personnalisable. Le composant parent peut injecter du HTML/contenu dans des emplacements définis par le composant enfant.

Slot simple :

Slots nommés :

Communication entre composants - Résumé

  • Props : Parent → Enfant (données descendantes)

  • Emits : Enfant → Parent (événements remontants)

  • Slots : Parent → Enfant (contenu HTML personnalisé)

Cette combinaison permet une communication flexible et maintenable entre les composants Vue.

Bonnes pratiques

Organisation du code

Structuration des composants :

Conventions de nommage

Performance et réactivité

Gestion des erreurs

Accessibilité et UX

📝 Travaux pratiques

Objectif

Créer une application de gestion de tâches simple pour réviser les concepts Vue 3 de base.

Étape 1 : Initialisation du projet

Créer un nouveau projet Vue 3 :

Configuration recommandée lors de la création :

  • ✅ TypeScript → Non (pour cette séance)

  • ✅ JSX → Non

  • ✅ Vue Router → Non (pour cette séance)

  • ✅ Pinia → Non (vu plus tard)

  • ✅ Vitest → Non

  • ✅ Playwright → Non

  • ✅ ESLint → Oui

📋 Aparté : Qu'est-ce qu'ESLint ?

ESLint est un outil d'analyse statique de code (linter) pour JavaScript et TypeScript qui permet de :

🎯 Objectifs principaux :

  • Détecter les erreurs : Variables non déclarées, code mort, erreurs de syntaxe

  • Uniformiser le style : Indentation, quotes, points-virgules, espaces

  • Appliquer les bonnes pratiques : Conventions de nommage, patterns recommandés

  • Améliorer la maintenabilité : Code plus lisible et cohérent en équipe

Toutes les informations et règles : https://eslint.org/

⚙️ Comment ça fonctionne :

🔧 Exemples de règles ESLint :

  • no-unused-vars : Signale les variables non utilisées

  • no-console : Interdit les console.log en production

  • indent : Force une indentation cohérente (2 ou 4 espaces)

  • quotes : Impose simple ou double quotes

  • semi : Gère les points-virgules obligatoires/interdits

🎨 Configuration Vue.js : ESLint pour Vue inclut des règles spécifiques :

  • vue/multi-word-component-names : Noms de composants multi-mots

  • vue/no-unused-components : Composants importés mais non utilisés

  • vue/order-in-components : Ordre des options dans les composants

💡 Intérêt en équipe :

  • Code homogène entre développeurs

  • Réduction des erreurs silencieuses

  • Facilite la relecture de code (code reviews)

  • Intégration continue (CI/CD) pour bloquer le code non conforme

Étape : Test et amélioration

Fonctionnalités à tester :

  1. Ajout de nouvelles tâches

  2. Validation du formulaire (champs requis)

  3. Marquage des tâches comme terminées

  4. Suppression des tâches

  5. Filtrage par statut

  6. Compteurs dynamiques

Améliorations possibles :

  • Ajouter une date de création

  • Permettre l'édition des tâches

  • Sauvegarder dans le localStorage

  • Ajouter des animations CSS

Last updated