Cours Vue.js Complet 💚
Les 12 chapitres essentiels — Composition API, réactivité, directives et écosystème
7. Composables (hooks Vue)
2. Template et directives
8. Cycle de vie et watchers
3. Réactivité (ref et reactive)
9. Formulaires
4. Computed et méthodes
10. Vue Router
5. Composants et props
11. Pinia (state management)
6. Événements et slots
12. Écosystème et bonnes pratiques
🏠 Hub Programmation
⚡ JavaScript (prérequis)
🔷 TypeScript
⚛️ React
☁️ AWS Cloud Practitioner
Introduction et installation
Vue.js est un framework progressif. Créé par Evan You en 2014, Vue combine le meilleur de React (composants, virtual DOM) et d'Angular (directives, two-way binding). Son approche SFC (Single File Component) regroupe template, logique et style dans un seul fichier .vue.
npm create vue@latest mon-app
# ✅ TypeScript? Yes
# ✅ Vue Router? Yes
# ✅ Pinia? Yes
cd mon-app
npm install
npm run dev # → http://localhost:5173 (Vite)
# Structure :
# mon-app/
# ├── src/
# │ ├── main.ts (point d'entrée)
# │ ├── App.vue (composant racine)
# │ ├── components/
# │ ├── views/ (pages)
# │ ├── router/
# │ └── stores/ (Pinia)
# ├── public/
# └── vite.config.ts
| Caractéristique | Vue.js |
|---|---|
| Paradigme | Composants + réactivité fine-grained |
| API | Composition API (recommandée) + Options API |
| Fichiers | SFC (.vue) : template + script + style |
| Réactivité | Proxy-based (automatique et fine-grained) |
| Tooling | Vite (build), Vue Devtools, Volar (IDE) |
| Écosystème | Vue Router, Pinia, Nuxt (SSR), VueUse |
Template et directives
:src=« imageUrl » :alt=« description » />
:href=« link »>Lien
v-if=« score >= 90 »>Excellent v-else-if=« score >= 50 »>Passable v-else>Échec
v-show=« isVisible »>Visible ou caché
.
@keyup.enter=« submit » />
v-if vs v-show : v-if ajoute/supprime l'élément du DOM (coût de montage). v-show le cache avec CSS display:none (coût initial, toggle rapide). Utilisez v-show pour les toggles fréquents, v-if pour les conditions rares.
Réactivité (ref et reactive)
Règle simple : utilisez ref() pour tout (strings, nombres, tableaux, objets). C'est le choix recommandé. reactive() est un cas spécial pour les objets complexes où .value est gênant. En cas de doute, ref().
Computed et méthodes
Total: €
computed vs méthode : un computed est caché — il ne se recalcule que si ses dépendances changent. Une méthode s'exécute à chaque rendu. Utilisez computed pour les valeurs dérivées de l'état, les méthodes pour les actions/événements.
Composants et props
ans
v-if=« isAdmin »>Admin
Les props sont en lecture seule (comme en React). Un composant enfant ne doit jamais modifier ses props. Si l'enfant a besoin de modifier une valeur, il émet un événement vers le parent.
Événements et slots
Mon contenu personnalisé
#header>Mon titre
Contenu principal
#footer>Pied de page
Composables (hooks Vue)
import from 'vue'
export function useFetch<T>(url: string)
// composables/useToggle.ts
export function useToggle(initial = false)
Les composables sont l'équivalent des custom hooks de React. Convention : use + nom (useFetch, useAuth, useTheme). La bibliothèque VueUse contient 200+ composables prêts à l'emploi.
Cycle de vie et watchers
watch vs watchEffect : watch = vous spécifiez explicitement quoi observer (+ accès ancien/nouveau). watchEffect = détecte automatiquement les dépendances (comme useEffect de React). Pour les side effects simples, watchEffect est plus concis.
Formulaires
v-model=« form.newsletter » type=« checkbox » />
Newsletter
v-model.trim=« form.email » />
v-model.number=« form.age » type=« number » />
v-model.lazy=« form.email » />
v-model = raccourci pour :value + @input. C'est le two-way binding de Vue. En React, il faudrait gérer value + onChange manuellement. Vue le fait en une directive. Les modifiers (.trim, .number, .lazy) ajoutent des traitements automatiques.
Vue Router
import from 'vue-router'
const router = createRouter()
// Navigation guard
router.beforeEach((to, from) => )
export default router
import from 'vue-router'
const router = useRouter()
const route = useRoute()
router.push('/dashboard')
router.replace('/login')
router.back()
route.params.id // Paramètre dynamique
route.query.q // Query string ?q=test
Pinia (state management)
import from 'pinia'
import from 'vue'
// Setup store (Composition API style — recommandé)
export const useCounterStore = defineStore('counter', () => )
Count: (double: )
Pinia remplace Vuex (l'ancien store de Vue). Il est plus simple (pas de mutations), typé nativement, et utilise la Composition API. Chaque store est indépendant — pas de store monolithique.
Écosystème et bonnes pratiques
| Besoin | Librairie |
|---|---|
| Framework full-stack | Nuxt 3 (SSR, auto-imports, API routes) |
| État global | Pinia (officiel) |
| Routing | Vue Router (officiel) |
| Data fetching | TanStack Query / Nuxt useFetch |
| Formulaires | VeeValidate + Zod |
| UI Components | PrimeVue / Vuetify / Radix Vue |
| Composables utilitaires | VueUse (200+ composables) |
| Tests | Vitest + Vue Testing Library |
| IDE | VSCode + Volar |
✅ À FAIRE
• (Composition API)
• ref() par défaut pour la réactivité
• computed pour les valeurs dérivées
• Composables pour la logique réutilisable
• defineProps typé avec TypeScript
• v-model pour les formulaires
• :key unique sur v-for
•
