Les démonstrations se basent sur ce code source

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:

  1. On peut imbriquer des v-for, c’est trùs utile pour les tables par exemple.
  2. On peut utilise v-for, v-bind et v-model ensemble, par exemple avec des boutons radios.
  3. 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 un v-if ou un autre v-else-if. Il est affichĂ© si toutes les expressions prĂ©cĂ©dentes sont fausses et que la sienne est vraie.
  • v-else: Doit suivre un v-if ou un v-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.