Les démonstrations se basent sur ce code source
Tester le code source
- Copier le fichier TD2Demo1.vue dans TD2Demo.vue
- lancer npm run serve puis visualiser le résultat dans le navigateur (par ex. http://localhost:8080)
- Montrer le code de App.vue. On constate que la valeur de la variable title est bien affiché comme un titre.
- le composant TD2Demo1 importĂ© dans App.vue sâutilise simplement en Ă©crivant une balise <TD2Demo1>.
- Idem pour les variables msg et htmlText définies dans TD2Demo1.
- Comme la deuxiĂšme contient du HTML, ce dernier nâest effectivement pas interprĂ©tĂ© avec {{ }}.
- On remarque quâavec v-html, le texte interne Ă la balise <span> nâest pas affichĂ©. Seul le contenu de htmlText est interprĂ©tĂ©. Câest le mĂȘme comportement quelle que soit la balise.
- Modifier le contenu de msg â le texte affichĂ© change
Afficher du texte dynamique
Pour afficher du texte dynamiquement (dans des balises tel que <p>
, <span>
, <li>
, âŠ) on utiliser cette syntaxe:
<p>{{ msg }}</p>
Exemple:
<template>
<p>{{ msg }}</p>
</template>
<script>
export default {
name: 'Exemple',
data: () => {
return {
msg: "Hello world!"
}
}
}
</script>
La valeur entre {{ }}
permet dây intĂ©grer une expression JavaScript. On est donc libre dâutiliser un nom de variable, un appel Ă une fonction etcâŠ
Limitations
On ne peut pas utiliser les mot-clĂ©s de contrĂŽle (if, for, while, âŠ). Pour intĂ©grer une condition ternaire, voir Conditions ternaires Les opĂ©rateurs logiques et arithmĂ©tiques sont en revanche utilisables.
Intégrer du HTML
La syntaxe {{ }}
ne permet pas dâintĂ©grer du HTML. Ce dernier sera affichĂ© tel quel. La solution est donc dâutiliser v-html
de cette maniĂšre:
<template>
<span v-html="htmlExemple"></span>
</template>
<script>
export default {
name: "Exemple2",
data: () => {
return {
"htmlExemple": "<strong>Hello</strong> world!"
}
}
}
</script>
Failles de sécurité
Ne JAMAIS utiliser
v-html
avec une variable entrĂ©e ou pouvant ĂȘtre modifiĂ©e par lâutilisateur. Cela permettrait dâinjecter du code Javascript
Directives
v-bind
Cette directive permet de dire Ă VueJS de placer la variable dans le DOM.
Si les {{ }}
(voir Afficher du texte dynamique) peuvent le faire, elles ne permettent pas de définir, par exemple, la valeur dans une balise <input>
.
On utilisera alors ces deux syntaxes:
<input :value="valeurInput">
<input v-bind:value="valeurImport">
De la mĂȘme façon que le texte dynamique, on peut utiliser des expressions JavaScript.
On peut également définir des attributs tel que readonly
, les class mais aussi le style.
Exemple:
<template>
<h1 :style="textStyle">Prix du produit</h1>
<input
type="number"
:readonly="readonly"
:value="price.toFixed(2)"
:class="price < 10 ? ['price-low'] : []">
</template>
<script>
export default {
name: "Exemple3",
data: () => {
return {
price: 20,
readonly: false,
textStyle: {
color: "gray",
fontSize: "30px"
}
}
}
}
</script>
TODO
Je dois rédiger la suite
v-model: liaison bi-directionnelle
JusquâĂ prĂ©sent, nous avons vu comment afficher des donnĂ©es depuis notre objet data dans le template Ă lâaide de lâinterpolation de texte ({{ }}
) et de la directive v-bind. Cependant, il est souvent nĂ©cessaire dâĂ©tablir une relation plus interactive entre le template et les donnĂ©es : lorsque lâutilisateur modifie une valeur dans le template, cette modification doit ĂȘtre rĂ©percutĂ©e dans lâobjet data.
Câest lĂ quâintervient la directive v-model
. Elle permet de crĂ©er une liaison bidirectionnelle entre un Ă©lĂ©ment du template (comme un champ de saisie, un bouton radio, une case Ă cocher ou une liste dĂ©roulante) et une propriĂ©tĂ© de lâobjet data.
Exemple
<template>
<input type="text" v-model="message">
<p>Vous avez tapé : {{ message }}</p>
</template>
<script>
export default {
name: "Exemple4",
data() {
return {
message: 'Hello, world!'
}
}
}
</script>
Utilisation courante
On retrouvera cette directive en général dans les input, checkboxes, bouton radio et select.
v-for: afficher des âlistesâ
Lorsquâon souhaite afficher un ensemble dâĂ©lĂ©ments similaires, comme une liste dâarticles, une sĂ©rie de cartes ou une table de donnĂ©es, il devient rapidement fastidieux de rĂ©pĂ©ter manuellement chaque Ă©lĂ©ment dans le template. Vue.js propose une solution Ă©lĂ©gante pour rĂ©soudre ce problĂšme : la directive v-for
.
v-for
permet dâitĂ©rer sur un tableau ou un objet, et de gĂ©nĂ©rer dynamiquement du contenu en fonction des Ă©lĂ©ments de cette structure de donnĂ©es. Cela permet de crĂ©er des listes, des tableaux, et bien dâautres Ă©lĂ©ments rĂ©utilisables.
La syntaxe est la suivante:
<element v-for="(item, index) in items" :key="key"></element>
L'attribut
:key
Quand on utilise la directive v-for, il est impĂ©ratif dâajouter lâattribut
:key=".."
qui sera une valeur unique, par exemple lâindex, ou lâidentifiant dâun utilisateur. On Ă©vitera Ă tout prix lâindex quand la liste peut-ĂȘtre rĂ©ordonnĂ©e, trier, ou si des Ă©lĂ©ments peuvent ĂȘtre ajoutĂ©s/supprimĂ©s au milieu de la liste.Plus dâinformations: stackoverflow
On a plusieurs possibilitĂ©s dâutilisations:
Itérer sur un Array
:
<ul>
<li v-for="(fruit, index) in fruits" :key="index">
{{ index + 1 }}. {{ fruit }}
</li>
</ul>
Itérer sur un Object:
<ul>
<li v-for="(value, key, _index) in person" :key="key">
{{ key }}: {{ value }}
</li>
</ul>
Plusieurs remarques:
- On peut imbriquer des v-for, câest trĂšs utile pour les tables par exemple.
- On peut utilise v-for, v-bind et v-model ensemble, par exemple avec des boutons radios.
- v-for peut sâappliquer Ă tout balise HTML (
div
,p
,option
, âŠ) mais aussi Ă tout les composants VueJS (ShopCard
,PrestatairePresentation
, âŠ)
Affichage conditionnel: v-if, v-else, v-else-if
Ces directives permettent de contrĂŽler lâaffichage dâĂ©lĂ©ments dans le DOM en fonction dâune condition boolĂ©enne.
v-if
: Affiche un Ă©lĂ©ment si lâexpression associĂ©e est Ă©valuĂ©e Ătrue
.v-else-if
: Doit suivre unv-if
ou un autrev-else-if
. Il est affiché si toutes les expressions précédentes sont fausses et que la sienne est vraie.v-else
: Doit suivre unv-if
ou unv-else-if
. Il est affiché si toutes les expressions précédentes sont fausses.
Exemple:
<template>
<!-- PremiĂšre condition -->
<div v-if="showParagraph">
<p>Ce paragraphe s'affiche si showParagraph est vrai.</p>
</div>
<div v-else-if="showOtherParagraph">
<p>Ce paragraphe s'affiche si showParagraph est faux et showOtherParagraph est vrai.</p>
</div>
<div v-else>
<p>Aucun des deux paragraphes ne s'affiche.</p>
</div>
</template>
<script>
export default {
name: "Exemple5",
data() {
return {
showParagraph: true,
showOtherParagraph: false
}
}
}
</script>
Porté de ces directives
Ces 3 directives conditionnelles sâappliquent Ă lâĂ©lĂ©ment (HTML ou composant) oĂč elle est dĂ©clarĂ©e, et donc Ă tout les enfants de cet Ă©lĂ©ment.