.JS
INTRODUCTION + WORKSHOP
Evan You
2016
Community driven
167 k ⭐
Evolutif
Déclaratif
Facile lire / écrire
Puissant
Elégant
Productif
REACT - ANGULAR
Virtual DOM
State ( optionel )
Single File Component
Puissant
Trop bien ...
VOUS et VUE ?
VOUS et FRAMEWORKS ?
VOUS et ES6 ?
VOUS et JavaScript ?
THEORIE
PRATIQUES ++
MISSIONS + SOLUTIONS
LIVE CODE
RESSOURCES
MODULE
BEST PRATICES
⭐
FORK ou CLONE
PROGRESSIF
COMPOSANT BASE
Les directives sont des attributs spéciaux avec le préfixe v-___
Les valeurs attendues pour les attributs de directives sont
une unique expression JavaScript
<div v-if="machin === true ">
Là vous me voyez
</div>
<div v-else>
Là vous ne me voyez pas
</div>
<div v-for="item in items" :key="item">
{{ item }}
</div>
//
...
data() {
return {
items: ['Vue', 'React', 'Angular', 'Polymer']
}
},
...
<input type="text" v-model="email">
//
...
data() {
return {
email: "alex@atypeak.dev"
}
},
...
Plus tard
COMPOSANT BASE
MISSION 2
<!-- lie un attribut -->
<img v-bind:src="imageSrc">
<!-- nom d'attribut dynamique (2.6.0+) -->
<button v-bind:[key]="value"></button>
<!-- notation abrégée -->
<img :src="imageSrc">
<button v-on:click="faireCeci"></button>
<button v-on:[event]="doThis"></button>
<button v-on:click="faireCela('hello', $event)"></button>
<button @click="faireCeci"></button>
<button @[event]="doThis"></button>
...
data() {
return {
name: null
},
methods: {
defineName(name) {
this.name = name;
}
}
...
MODIFIE LES DATA
pas cache
executé sur appel
// template
{{ name }}
{{ salutation }}
// script
...
data() {
return {
name: 'machin'
},
computed: {
salutation() {
return `Salut ${this.name.toUpperCase()},
ton nom a ${this.name.length} lettres.`
}
}
...
RETOURNE LES DATA
modifié, calculé ...
cache
RE-calculé si dependance modifié
// template
<input v-model="name">
// script
...
data() {
return {
name: 'machin'
},
watch: {
name(value, oldValue) {
// faire des trucs ici...
}
}
...
REACTIF
nested
GET / SET
COMPOSANT BASE
MISSION 2.1
// dans le composant parent.vue
<script>
import enfant from "./components/enfant";
export default {
components: { enfant },
...
// dans main.js
import MyComponent from '@/components/MyComponent'
Vue.component('my-component-name', MyComponent)
x
Y
Y
x
props
event
props
props
<parent>
...
<enfant v-bind:key="value" >
...
</enfant>
...
</parent>
props
<user-list>
...
<user :user="singleUserValue" >
...
</user>
...
</user-list>
exemple parent
props
{{ user }}
...
props: ['user'],
...
this.user
exemple enfant
<user-list>
...
<user :user="singleUserValue" >
...
</user>
...
</user-list>
exemple parent
event
...
this.$emit('eventName', payload )
...
Depuis le composant enfant
event
...
<button
@click="defineFavorite(user.name)">
⭐
</button>
...
props: ["user"],
methods: {
defineFavorite(name) {
this.$emit("favoriteUser", name);
}
}
...
Exemple Enfant
Exemple Parent
event
...
<button
@click="defineFavorite(user.name)">
⭐
</button>
...
props: ["user"],
methods: {
defineFavorite(name) {
this.$emit("favoriteUser", name);
}
}
...
Exemple Enfant
<user-list>
...
<user
v-bind:user="singleUserValue"
v-on:favoriteUser="defineFavorite">
..
</user>
...
</user-list>
data() {
return {
favorite: null
}
}
...
methods: {
defineFavorite(name) {
this.favorite = name;
}
}
Exemple Parent
VUE-CLI
MISSION
// Composant myBtn.vue
...
<template>
<button class="text-xl mx-2 my-1
bg-blue-200 hover:bg-blue-600"
type="submit"
>
<slot></slot>
</button>
</template>
...
// Composant myBtn.vue
...
<template>
<button class="text-xl mx-2 my-1
bg-blue-200 hover:bg-blue-600"
type="submit"
>
<slot></slot>
</button>
</template>
...
// dans le parent
...
<my-btn>
Mon texte
</my-btn>
...
beforeCreate()
created()
beforeMount()
mounted()
beforeUpdate()
updated()
beforeDestroy()
destroyed()
beforeCreate()
created()
beforeMount()
mounted()
beforeUpdate()
updated()
beforeDestroy()
destroyed()
NUXT
MISSION
STORE
STORE
state
getters
mutations
actions
data()
computed
methods
async methods
STORE
COMPOSANT
@vue___
dev.to // medium