Progressive Framework

Vue

Vue est le framework progressif : adoptez-en autant ou aussi peu que nécessaire, avec une syntaxe de template proche du HTML et une réactivité qui fonctionne tout simplement.

intermediate15 min readUpdated 15 sept. 2026
Counter.vue
vue
<!-- Counter.vue -->
<script setup>
import { ref } from "vue";

const count = ref(0);
</script>

<template>
  <button @click="count++">
    Clicked {{ count }} times
  </button>
</template>
Première version
2014, par Evan You
Version majeure actuelle
Vue 3
Modèle
Framework progressif
Réactivité
ref, reactive, computed
Composants
Fichiers .vue single-file
Outillage
Vite, Nuxt, Vue Router, Pinia

Pourquoi c'est important

Pourquoi les développeurs aiment Vue

Templates accessibles

La syntaxe de template est du HTML avec quelques directives, permettant ainsi aux designers et aux débutants de lire un composant sans avoir à apprendre JSX au préalable.

Réactivité automatique

Modifiez une valeur et la vue se met à jour. Vue suit les dépendances pour vous, éliminant ainsi le besoin de diffing manuel ou de setState.

Adoption progressive

Intégrez Vue dans une seule page via une balise script, ou construisez une application complète avec Nuxt. Le même modèle s'adapte aux deux approches.

Le tableau complet

Les trois piliers de Vue

Un template, un système de réactivité et des composants single-file. Vue rend le premier accessible et le second invisible.

Templates

Markup

Du HTML étendu avec des directives comme v-if, v-for et v-model qui lient la vue à vos données.

Réactivité

Données

ref et reactive rendent les valeurs observables, tandis que computed et watch réagissent aux changements.

Composants

Composition

Les composants single-file regroupent le template, la logique et les styles scoped dans un seul fichier .vue.

Vue en un coup d'œil

Le cœur de Vue

Composants single-file

Template, script et style scoped réunis dans un seul fichier .vue.

Syntaxe de template

Interpolation avec doubles accolades et directives comme v-if et v-for.

ref et reactive

Les deux primitives de réactivité pour gérer l'état dans la Composition API.

computed et watch

Dérivez des valeurs automatiquement ou exécutez des effets de bord lors d'un changement.

Props et emits

Transmettez des données vers le bas avec les props et envoyez des événements vers le haut avec les emits.

La Composition API

Regroupez la logique par fonctionnalité dans script setup plutôt que de la disperser entre différentes options.

Un bref aperçu

D'un projet personnel à l'un des trois frameworks leaders

  1. 2014

    Vue 1

    Evan You lance Vue après avoir travaillé sur Angular, avec l'objectif de créer un framework plus léger et plus accessible.

    14
  2. 2016

    Vue 2

    Le DOM virtuel et un écosystème florissant font de Vue l'un des frameworks les plus populaires au monde.

    16
  3. 2020

    Vue 3

    Arrivée de la Composition API, d'un meilleur support TypeScript et d'un système de réactivité plus rapide.

    20
  4. 2022

    script setup

    Une macro de compilateur qui rend la Composition API concise et devient le standard recommandé.

    22
  5. Aujourd'hui

    Un favori stable

    Vue reste un choix de premier plan pour les équipes recherchant de la puissance sans courbe d'apprentissage abrupte.

    Aujourd'hui

Le guide complet

Vue: Tout ce que vous devez savoir

Qu’est-ce que Vue ?

Vue est un framework JavaScript progressif pour la création d’interfaces utilisateur. Ce terme est délibéré : vous pouvez intégrer Vue sur une seule page pour améliorer un widget spécifique, ou l’utiliser avec un outil de build pour construire une application complète. Aucune réécriture n’est nécessaire pour en tirer profit, et le framework évolue selon vos besoins.

Essentiellement, Vue repose sur deux piliers : une syntaxe de template qui étend le HTML, et un système de réactivité qui suit vos données et met à jour la vue automatiquement. Vous déclarez ce que l’UI doit afficher, et Vue s’occupe de la synchronisation.

Composants monofichier (Single-file components)

Un composant Vue réside généralement dans un fichier .vue composé de trois blocs : un template, un script et des styles. Le fait de les regrouper fait du composant une unité unique et autonome.

<!-- Card.vue -->
<script setup>
defineProps({ title: String });
</script>

<template>
  <article class="card">
    <h3>{{ title }}</h3>
    <slot />
  </article>
</template>

<style scoped>
.card {
  border-radius: 1rem;
  padding: 1.5rem;
}
</style>

<style scoped> limite automatiquement le CSS à ce composant, empêchant ainsi les noms de classes de “fuiter” vers l’extérieur. <script setup> est une macro de compilation qui rend la Composition API plus concise et constitue le standard moderne.

Syntaxe des templates

Les templates Vue sont du HTML enrichi d’un petit ensemble de directives. L’interpolation utilise des doubles accolades, et les directives sont des attributs préfixés par v-.

<!-- profile.vue -->
<template>
  <h1>{{ user.name }}</h1>
  <p v-if="user.online">Online</p>
  <p v-else>Offline</p>

  <ul>
    <li v-for="post in posts" :key="post.id">
      {{ post.title }}
    </li>
  </ul>

  <img :src="user.avatar" :alt="user.name" />
  <button @click="follow">Follow</button>
</template>

Lisez les raccourcis ainsi : :src lie un attribut à une expression, et @click écoute un événement. v-if gère le rendu conditionnel, et v-for effectue des boucles avec une :key pour des mises à jour efficaces. Le template est compilé en fonctions de rendu, mais vous aurez rarement besoin de les consulter.

Réactivité : ref et reactive

Le système de réactivité de Vue surveille vos données et déclenche un nouveau rendu lorsqu’elles changent. Dans la Composition API, vous créez des valeurs réactives avec ref ou reactive.

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

const count = ref(0);           // .value in script
const user = reactive({         // proxy, no .value
  name: "Ada",
  online: true,
});

function increment() {
  count.value += 1;
}
</script>

ref enveloppe n’importe quelle valeur et y accède via .value dans le script, bien que les templates le déballent automatiquement pour vous. reactive retourne un proxy profondément réactif pour un objet. Une convention courante consiste à utiliser ref systématiquement, car il fonctionne pour les primitives et est facile à réassigner.

Computed et watch

Deux fonctions permettent de gérer les valeurs dérivées et les effets de bord.

<script setup>
import { ref, computed, watch } from "vue";

const items = ref([10, 20, 30]);

const total = computed(() =>
  items.value.reduce((sum, n) => sum + n, 0),
);

watch(items, (next, prev) => {
  console.log("items changed", prev, next);
});
</script>

computed met son résultat en cache et ne le recalcule que lorsqu’une dépendance change — utilisez-le dès qu’une valeur est dérivée d’un autre état. watch exécute un callback lorsqu’une source change et sert aux effets de bord tels que la journalisation, la récupération de données ou la sauvegarde. Utiliser watch pour calculer une valeur est une erreur courante.

Props, emits et slots

Les données descendent via les props et remontent via les événements émis (emits).

<!-- Child.vue -->
<script setup>
const props = defineProps({
  label: { type: String, required: true },
});
const emit = defineEmits(["select"]);

function handleClick() {
  emit("select", props.label);
}
</script>

<template>
  <button @click="handleClick">{{ label }}</button>
</template>
<!-- Parent.vue -->
<Child label="Save" @select="onSelect" />

Les props sont en lecture seule dans l’enfant, ce qui permet de maintenir la source de vérité dans le parent. Les slots permettent à un parent de passer du balisage à un enfant, l’équivalent des children de React.

Composables

Le plus grand avantage de la Composition API est la logique réutilisable. Un composable est une fonction qui utilise la réactivité et retourne un état, nommée avec un préfixe use.

// useFetch.js
import { ref, watchEffect } from "vue";

export function useFetch(url) {
  const data = ref(null);
  const error = ref(null);

  watchEffect(async () => {
    data.value = null;
    error.value = null;
    try {
      const res = await fetch(url.value);
      data.value = await res.json();
    } catch (err) {
      error.value = err;
    }
  });

  return { data, error };
}

Les composables partagent la logique, et non l’état ; ainsi, chaque composant qui appelle useFetch obtient ses propres données indépendantes. C’est l’équivalent Vue d’un hook personnalisé.

Routage et état

Vue Router gère la navigation via un mappage déclaratif entre l’URL et le composant, et Pinia est le store officiel pour l’état partagé.

// router.js
import { createRouter, createWebHistory } from "vue-router";

export const router = createRouter({
  history: createWebHistory(),
  routes: [
    { path: "/", component: Home },
    { path: "/users/:id", component: UserProfile },
  ],
});

Utilisez un store lorsque plusieurs composants éloignés ont besoin du même état. Pour les données locales ou les échanges parent-enfant, les props et les composables sont généralement suffisants.

Bonnes pratiques

  • Utilisez script setup et la Composition API pour tout nouveau code.
  • Privilégiez computed à watch pour les valeurs dérivées.
  • Gardez les props en lecture seule et émettez des événements pour les modifications.
  • Extrayez la logique réutilisable dans des composables.
  • Utilisez des styles scoped, ou des CSS Modules, pour garder les styles locaux.
  • Nommez vos composables avec un préfixe use.
  • Évitez d’accéder directement à l’état d’un composant enfant ; communiquez via les props et les emits.

Erreurs courantes

  • Oublier .value sur une ref à l’intérieur du script.
  • Utiliser watch pour calculer une valeur que computed devrait dériver.
  • Muter des props dans un composant enfant au lieu d’émettre un événement.
  • Déstructurer un objet reactive et perdre ainsi la réactivité.
  • Placer tout l’état dans un store global alors qu’un état local suffirait.
  • Mélanger l’Options API et la Composition API sans raison valable.

Et après ?

Vue est une excellente porte d’entrée pour découvrir les frameworks de composants et s’adapte à tous types de projets. Ajoutez Nuxt pour le rendu serveur et les conventions de routage, comparez cette approche avec React et Svelte, et continuez à perfectionner votre JavaScript. Ensuite, lancez-vous dans un petit projet — une liste filtrable ou un formulaire avec validation — et laissez la réactivité faire le travail.

Valeurs dérivées

Utilisez computed pour les valeurs qui dépendent d'un autre état. watch est destiné aux effets de bord, pas au calcul.

Préférer
const items = ref([1, 2, 3]);
const total = computed(() =>
  items.value.reduce((a, b) => a + b, 0),
);
Éviter
const total = ref(0);
watch(items, () => {
  total.value = items.value.reduce(
    (a, b) => a + b, 0,
  );
});

Liaison d'inputs

v-model gère la valeur et l'événement de mise à jour, vous évitant ainsi de les câbler manuellement.

Préférer
<input v-model="query" />

<script setup>
const query = ref("");
</script>
Éviter
<input
  :value="query"
  @input="query = $event.target.value"
/>

FAQ

Foire aux questions

Keep learning

Related topics from the roadmap.

$ commencer à apprendre

Prêt à apprendre Vue ?

Notre tutoriel interactif vous guide à travers Vue pas à pas — avec des quiz et du vrai code que vous pouvez exécuter dans le navigateur.