Vue : construire une application web (école d'ingénieur) · Chapitre 4 · Application directe du cours
Options objets
Formulaires · niveau 2
Énoncé
Que montre la page après le choix du « Petit Prince » ? Quelle est la valeur de l'attribut value des options dans le DOM, et pourquoi cela n'a-t-il pas d'importance ?
<div id="app">
<div>
<label>Livre
<select v-model="choisi">
<option :value="null">— choisir —</option>
<option v-for="l in livres" :key="l.isbn" :value="l">{{ l.titre }}</option>
</select>
</label>
<p v-if="choisi">{{ choisi.titre }} : {{ choisi.prix }} €, ISBN {{ choisi.isbn }}</p>
<p>{{ choisi === livres[1] }}</p>
</div>
</div>
const { createApp, ref } = Vue;
createApp({
setup() {
const livres = [
{ isbn: "9782956300014", titre: "Programmation Java", prix: 32 },
{ isbn: "9782956300052", titre: "Le Petit Prince", prix: 8.5 },
];
return { livres, choisi: ref(null) };
},
}).mount("#app");Corrigé
Le texte de la page après le choix, puis la valeur des options dans le DOM :
Livre
— choisir —
Programmation Java
Le Petit Prince
Le Petit Prince : 8.5 €, ISBN 9782956300052
false
"— choisir —" "[object Object]" "[object Object]"
:value="l" lie l'objet lui-même : la donnée choisi donne accès au titre, au prix et à l'ISBN du livre choisi. La comparaison avec le second livre affiche pourtant false : une ref qui reçoit un objet le rend réactif en profondeur, et contient donc un proxy de l'objet (chapitre 3), qui n'est pas l'objet d'origine. Pour comparer des objets, on compare leur identifiant (isbn), jamais leur référence. Dans le DOM, l'attribut ne peut contenir qu'une chaîne, d'où « [object Object] » ; mais Vue garde de son côté le lien entre chaque option et sa valeur, et ne lit jamais cet attribut.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.