Vue-Js
Debutant
Quiz-Vuejs-Debutant
Vuejs-Composants
Vuejs-Directives
Vue-Router
Vuejs-Options-Api
V-Model
Questions-Entretien-Vuejs
Qcm-Vuejs
Apprendre-Vuejs
Javascript
Front-End
Vue-3
📝
Vue Débutant — Composants & Router
20 questions sur les bases de Vue.js : composants, directives et Vue Router. Idéal pour préparer un entretien développeur Vue.js débutant.
Banque de révision : les 30 questions corrigées
Voici l'intégralité des 30 questions de « Vue Débutant — Composants & Router », chacune avec sa bonne réponse et son explication. Le quiz interactif ci-dessus en tire une sélection aléatoire à chaque tentative — utilisez cette liste complète pour réviser.
Explication :
Vue.js est un framework JavaScript progressif créé par Evan You. Il est conçu pour être adoptable de manière incrémentale : on peut l'utiliser pour une simple partie de page ou pour des applications complètes (SPA).
Vue.js est dit "progressif" car vous pouvez l'intégrer progressivement dans un projet existant, sans tout réécrire.
Explication :
La commande officielle est
npm create vue@latest. Elle lance un assistant interactif qui propose TypeScript, Vue Router, Pinia, Vitest, et d'autres options.
Le projet créé utilise Vite comme outil de build par défaut, offrant un démarrage rapide et un HMR (Hot Module Replacement) efficace.
Explication :
La Composition API (introduite dans Vue 3) permet d'organiser la logique par fonctionnalité plutôt que par option. On utilise
ref(), reactive(), computed(), watch() dans la fonction setup() ou <script setup>.
La Composition API facilite la réutilisation de la logique entre composants via les composables (fonctions qui retournent de la logique réactive).
Explication :
v-if et v-show permettent toutes les deux l'affichage conditionnel. v-if ajoute/supprime l'élément du DOM. v-show utilise display: none en CSS (l'élément reste dans le DOM).
Utilisez
v-if quand la condition change rarement. Utilisez v-show pour des basculements fréquents (meilleure performance).
Explication :
L'interpolation utilise la syntaxe "Moustache"
{{ expression }}. Vue.js évalue l'expression et met à jour automatiquement le DOM quand la valeur change. Exemple : <p>Bonjour {{ nom }}</p>.
L'interpolation ne fonctionne que dans le contenu texte, pas dans les attributs HTML. Pour les attributs, utilisez
v-bind ou son raccourci :.
Explication :
v-bind:src="imageUrl" ou le raccourci :src="imageUrl" lie un attribut HTML à une expression JavaScript. L'attribut est mis à jour réactivement.
Pour lier plusieurs attributs à la fois, utilisez
v-bind="objet" où l'objet contient les paires clé-valeur des attributs.
Explication :
v-on:click="handleClick" ou le raccourci @click="handleClick" écoute l'événement click. On peut aussi écrire du code inline : @click="count++".
Pour passer l'événement natif :
@click="handleClick($event)". Pour des modificateurs : @click.stop (stopPropagation), @click.prevent (preventDefault).
Explication :
ref(valeur) crée une référence réactive pour les valeurs primitives (string, number, boolean). reactive(obj) rend un objet entier réactif. Dans le template, les refs sont automatiquement "déballées" (pas besoin de .value).
Dans le
<script setup>, déclarez simplement const count = ref(0). Dans le template, utilisez {{ count }} sans .value.
Explication :
v-model="variable" crée une liaison bidirectionnelle sur les champs de formulaire (input, textarea, select). La variable se met à jour quand l'utilisateur modifie le champ, et le champ se met à jour si la variable change. v-model est un sucre syntaxique pour :value + @input. Il fonctionne avec tous les types de champs de formulaire.
Explication :
v-for="item in items" (ou v-for="item of items") itère sur un tableau ou un objet. Il est fortement recommandé de fournir une clé unique avec :key="item.id".
On peut aussi obtenir l'index :
v-for="(item, index) in items". Pour les objets : v-for="(value, key, index) in objet".
Explication :
Un composant Vue (fichier
.vue) encapsule un template (HTML), un script (JavaScript) et un style (CSS). Il peut recevoir des props (données du parent) et émettre des événements vers le parent.
Un fichier
.vue est un Single File Component (SFC). Il contient trois sections : <template>, <script>, <style>.
Explication :
Les props permettent au parent de passer des données à l'enfant. Dans l'enfant (Composition API) :
const props = defineProps({ titre: String }). Dans le parent : <Enfant :titre="monTitre" />.
Les props sont en lecture seule. Ne modifiez jamais une prop dans l'enfant. Utilisez plutôt une copie locale ou émettez un événement.
Explication :
L'enfant émet des événements :
const emit = defineEmits(["update"]); emit("update", valeur). Le parent écoute : <Enfant @update="handleUpdate" />.
Pour le two-way binding sur une prop, utilisez
v-model côté parent et defineProps + defineEmits(["update:modelValue"]) côté enfant.
Explication :
ref() crée une valeur réactive. Pour les primitives, c'est obligatoire (Vue ne peut pas détecter les changements sur des primitives avec reactive). Dans le template, la ref est automatiquement "déballée" (pas besoin de .value). ref() peut aussi référencer un élément du DOM avec l'attribut ref dans le template : <input ref="monInput" />.
Explication :
computed() crée une valeur calculée réactive. Elle est mise en cache : elle ne se recalcule que si ses dépendances réactives changent. Beaucoup plus performant qu'une méthode appelée dans le template.
Utilisez
computed() plutôt qu'une méthode dans le template quand le calcul est coûteux ou utilisé plusieurs fois.
Explication :
watch(source, callback) surveille une ou plusieurs sources réactives et exécute un callback quand elles changent. watchEffect() suit automatiquement toutes les dépendances réactives utilisées dans la fonction.
Utilisez
watchEffect() quand vous n'avez pas besoin de l'ancienne valeur et que vous voulez un suivi automatique des dépendances.
Explication :
<script setup> est une syntaxe simplifiée de la Composition API. Les imports, variables et fonctions sont directement disponibles dans le template. Plus besoin de setup() explicite ni de return.
Avec
<script setup>, defineProps(), defineEmits() et defineExpose() sont des macros du compilateur, pas besoin de les importer.
Explication :
:class accepte un objet, un tableau ou une chaîne. La syntaxe objet est la plus courante : :class="{ active: isActive }". On peut aussi utiliser un tableau : :class="[classeA, classeB]".
On peut combiner classe statique et dynamique :
<div class="static" :class="{ active: isActive }">.
Explication :
Les hooks de cycle de vie permettent d'intervenir à différentes étapes :
onBeforeMount, onMounted (composant dans le DOM), onUpdated (après mise à jour), onUnmounted (nettoyage).
Le hook le plus utilisé est
onMounted() pour les appels API initiaux. Pour le nettoyage (intervalles, écoutes), utilisez onUnmounted().
Explication :
Avec
<script setup>, il suffit d'importer le composant : import MonComposant from "./MonComposant.vue". Il est immédiatement disponible dans le template : <MonComposant />.
Pour les composants utilisés dans beaucoup de pages, vous pouvez les enregistrer globalement dans
main.js avec app.component("Nom", Composant).
Explication :
Pinia est le gestionnaire d'état officiel recommandé pour Vue.js 3. Il remplace Vuex avec une API plus simple, un meilleur support TypeScript, et pas de mutations (on modifie directement le state via des actions).
Un store Pinia se définit avec
defineStore(). Il expose un state, des getters (computed) et des actions (méthodes).
Explication :
Pour que
v-model fonctionne sur un composant, il doit : 1) accepter une prop modelValue, 2) émettre emit("update:modelValue", nouvelleValeur). On peut aussi nommer le v-model : v-model:titre → prop titre + emit update:titre.
Avec
defineModel() (Vue 3.4+), la gestion de v-model est encore plus simple : const model = defineModel().
Explication :
Vue Router est le routeur officiel pour Vue.js. Il permet de naviguer entre différentes vues sans rechargement de page. On définit des routes liées à des composants, et on utilise
<RouterView /> pour afficher la vue courante.
Installez-le avec
npm install vue-router. Configurez les routes dans un fichier router/index.js.
Explication :
Le composable
useRouter() donne accès au routeur. router.push("/users") navigue (ajoute à l'historique). router.replace("/users") navigue sans ajouter à l'historique. router.go(-1) recule.
Pour passer des paramètres :
router.push({ name: "user", params: { id: 123 } }).
Explication :
Les slots permettent à un composant parent d'injecter du contenu dans un composant enfant. Dans l'enfant :
<slot></slot>. Dans le parent : <Enfant><p>Mon contenu</p></Enfant>.
Les slots nommés :
<slot name="header">. Les slots scopés : l'enfant expose des données au parent via <slot :data="maData">.
Explication :
Vue.js n'a pas de module HTTP intégré. On utilise
fetch() (natif) ou Axios. Typiquement, on fait l'appel dans onMounted() et on stocke le résultat dans une ref().
Créez des composables pour encapsuler la logique de fetch :
const { data, loading, error } = useFetch("/api/users").
Explication :
<Teleport to="body"> déplace le rendu de son contenu vers l'élément cible (ex: body). Très utile pour les modales, les tooltips, les notifications qui doivent être en dehors du flux normal.
Le contenu téléporté reste réactif et connecté à son composant parent, même s'il est physiquement ailleurs dans le DOM.
Explication :
Pour des formulaires simples,
v-model + des conditions suffisent. Pour des formulaires complexes avec validation, VeeValidate (basé sur yup/zod) et FormKit sont les solutions les plus populaires.
VeeValidate s'utilise avec
useForm() et useField() en Composition API.
Explication :
v-bind="objet" (sans argument) lie toutes les propriétés de l'objet comme attributs HTML. Exemple : const attrs = { id: "monId", class: "maClasse" } → <div v-bind="attrs">.
Très utile pour passer dynamiquement tous les attributs d'un composant parent à un élément natif avec
inheritAttrs: false et v-bind="$attrs".
Explication :
public/ : fichiers servis directement, sans traitement (ex: favicon.ico). Référencés par chemin absolu (
/image.png). src/assets/ : fichiers traités par Vite (optimisation, hash dans le nom). Importés dans le code (import logo from "./assets/logo.png").
Utilisez
src/assets/ pour les images qui font partie de l'application (optimisation automatique). Utilisez public/ pour les fichiers qui doivent garder leur nom (robots.txt).