Cheatsheet : Vue.js
Vue.js : l'essentiel pour votre apprentissage dans une cheatsheet signée laConsole.
Lien CDN
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
- Pour amener de la réactivité partielle (projet basé sur une autre techno)
- Pas de phase de build => pas de transpilation
.vue
,.scss
,.ts
…
Installation avec Vite
npm init vue@latest
- Pour projet Vue complet
- Serveur local avec
npm run dev
- Phase de build => transpilation
.vue
,.scss
,.ts
…
Data (state)
Données réactives propres au composant.
export default {
data() {
return {
maVariable: "Valeur"
}
},
// ...
}
MAJ state (script
) => MAJ données affichées (template
) #onewaydatabinding
Méthodes
Logique propre au composant.
export default {
methods: {
maMethode() {
// ...
}
},
// ...
}
this
pour faire référence à une donnée réactive depuis l’objet courant
Computed
Méthode optimisée retournant une valeur basée sur la logique définie.
export default {
computed: {
maProprieteCalculee() {
// Retourne un résultat basé sur une donnée réactive (this)
}
},
// ...
}
- Si pas de données réactives : retourne un résultat mis en cache
- Si données réactives inchangées : retourne un résultat mis en cache
- Si données réactives modifiées : recalcul du résultat, aussitôt mis en cache
- Pas de parenthèses lors de l’appel
Watcher
Action délenchée suite à la modification d’une donnée réactive.
export default {
data() {
return {
maVariable: 0
}
},
watch: {
maVariable(newValue, oldValue) {
// ...
}
}
}
newValue
récupère la valeur après modificationoldValue
récupère la valeur avant modification
Affichage dynamique (dans un template)
{{ maVariable }}
{{ maMethode() }}
{{ maProprieteCalculee }}
Squelette composant .vue (SFC)
Composant .vue
contenant structure + mise en forme + logique.
<!-- MyComponent.vue -->
<script></script>
<template></template>
<style scoped></style>
- Nommer avec au moins 2 mots et en
PascalCase
scoped
=> restreint le CSS à ce composant- Attribut
lang
=> utiliser préprocesseur, moteur de template ou superset - Un seul enfant dans les balises
<template></template>
Enregistrer un composant
// Enregistrement local : ParentComponent.vue
import MyComponent from './components/MyComponent.vue'
export default {
components: {
'MyComponent': MyComponent
}
}
// Enregistrement global : main.js
import MyComponent from './components/MyComponent.vue'
createApp(App)
.component('MyComponent', MyComponent)
.mount('#app')
- Enregistrement global si réutilisé de nombreuses fois
- Enregistrement local si utilisation occasionnelle
- Utiliser avec
<MyComponent></MyComponent>
ou<MyComponent/>
Props
Transmission de données à un composant enfant.
<!-- ParentComponent.vue -->
<MyGallery theme="future" :pictures="myPictures"/>
<!-- MyGallery.vue -->
<script>
export default {
props: {
theme: String,
pictures: Array
},
// ...
}
</script>
this
pour faire référence à une prop depuis l’objet courant{{ maProp }}
pour l’afficher dans un template
Emits
Transmission de données à un composant parent.
<!-- ParentComponent.vue -->
<template>
<MyComponent @custom-event="handleCustomEvent"/>
</template>
<script>
export default {
methods: {
handleCustomEvent(payload) {
// Ma logique...
}
},
// ...
};
</script>
<!-- MyComponent.vue -->
<template>
<button @click="sendCustomEvent">
Cliquez pour émettre l'événement
</button>
</template>
<script>
export default {
methods: {
sendCustomEvent() {
this.$emit('custom-event', { data1: "foo", data2: "bar" });
}
},
// ...
}
</script>
this.$emit
déclenche l’évènement personnalisé du parentpayload
(optionnel) contient les données transmises lors du$emit
Hooks (cycle de vie des composants)
Exécuter un script à un moment précis du cycle de vie d’un composant.
export default {
beforeCreate() {
// Avant la création du composant
},
created() {
// Après la création du composant
},
beforeMount() {
// Avant le montage sur le DOM
},
mounted() {
// Après le montage sur le DOM
},
beforeUpdate() {
// Avant la mise à jour du composant
},
updated() {
// Après la mise à jour du composant
},
beforeUnmount() {
// Avant le démontage du composant du DOM
},
unmounted() {
// Après le démontage du composant du DOM
}
}
Évènements (v-on)
Réagir à des évènements.
<script>
export default {
data() {
return {
counter: 0
}
}
}
</script>
<template>
<button v-on:click="increment($event)">Cliquez-moi</button>
<p>Le bouton a été cliqué {{ counter }} fois.</p>
</template>
v-on:
peut être abrégé en@
$event
(optionnel) => contient des infos sur l’évènement
Binding (v-bind)
Lier à un attribut HTML des données/une expression JS.
<script>
export default {
data() {
return {
image: {
src: 'happy-tired-dev.jpg',
alt: 'Un dev fatigué mais heureux'
}
}
}
}
</script>
<template>
<img v-bind:src="image.src" v-bind:alt="image.alt">
</template>
v-bind:
peut être abrégé en :
Rendu itératif (v-for)
Boucler sur des nombres, tableaux ou objets.
<script>
export default {
data() {
return {
products: [
{
name: "Produit n°1",
price: 39.99,
stock: 4
},
// ...
]
}
}
}
</script>
<template>
<article v-for="(product, i) in products" :key="product.name">
<h2>{{ product.name }}</h2>
...
</article>
</template>
i
(optionnel) contient l’indice de boucle (0
,1
,2
…)- Penser à binder une clé (unique) avec
:key
- Boucler sur des groupes de balises voisines =>
v-for
sur<template>
Rendu conditionnel (v-if)
Conditionner l’affichage de balises.
<script>
export default {
data() {
return {
premium: true
}
}
}
</script>
<template>
<div class="content-premium" v-if="premium">
...
</div>
<div class="content-premium" v-else>
...
</div>
</template>
- Si
false
=> balises retirées du DOM v-else-if
pour des scénarios alternatifs supplémentaires- Conditionner l’affichage de groupes de balises voisines =>
v-if
sur<template>
Rendu conditionnel (v-show)
Conditionner l’affichage de balises.
<script>
export default {
data() {
return {
menuOpened: false
}
}
}
</script>
<template>
<nav class="menu-burger" v-show="menuOpened">
...
</nav>
</template>
- Si
false
=> balises masquées (display: none
) du DOM - Privilégier pour des mécaniques de « toggle »
v-show
ne peut pas s’utiliser sur une balise<template>
v-show
ne peut pas s’utilsier conjointement avecv-else
Liaison avec les formulaires (v-model)
Synchroniser les champs de formulaire au state.
export default {
data() {
return {
username: ''
}
},
// ...
}
<template>
<input type="text" name="username" v-model="username">
</template>
MAJ données de formulaires (template
) => MAJ state (script
) #twowaydatabinding
Slot (v-slot)
Permet d’insérer du contenu dans un composant.
<!-- - - - - - SLOT SIMPLE - - - - - -->
<!-- MyComponent.vue -->
<template>
<div class="my-component">
<slot>Contenu par défaut</slot>
</div>
</template>
<!-- ParentComponent.vue -->
<template>
<MyComponent>
Contenu pour le slot
</MyComponent>
</template>
<!-- - - - - - SLOTS NOMMÉS - - - - - -->
<!-- MyComponent.vue -->
<template>
<div class="my-component">
<slot name="slot-1"></slot>
<slot name="slot-2"></slot>
</div>
</template>
<!-- ParentComponent.vue -->
<template>
<MyComponent>
<template v-slot:slot-1>
Contenu pour le slot 1
</template>
<template v-slot:slot-2>
Contenu pour le slot 2
</template>
</MyComponent>
</template>
v-slot:
peut être abrégé en#
- Contenu envoyé peut contenir des balises HTML
Installation (Vue Router)
npm install vue-router@4
Installation simplifiée à l’initialisation avec npm init vue@latest
Définition des routes (Vue Router)
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import AboutView from '../views/AboutView.vue'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'home',
component: HomeView
},
{
path: '/a-propos',
name: 'about',
component: AboutView
},
// ...
]
})
export default router
Composants (Vue Router)
<RouterLink to="/">Accueil</RouterLink>
<RouterLink to="/a-propos">A propos</RouterLink>
<RouterLink :to="'/profil/' + user.id">Profil</RouterLink>
<RouterView/>
<RouterLink to="...">
remplace<a href="...">
<RouterView/>
=> conteneur pour le composant associé à la route
Appel de route dans les scripts (Vue Router)
// Par son chemin
this.$router.push('a-propos')
this.$router.push({ path: 'a-propos' })
// Par son nom
this.$router.push({ name: 'about' })
// Transmission de paramètres de routes
this.$router.push({ ..., params: { id: '10' } })
// Transmission de paramètres HTTP GET
this.$router.push({
...,
query: {
param1: 'foo',
param2: 'bar'
}
})