Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle...

44
#DevoxxFR Entrevue avec Vue.js Ludovic Ladeu Thomas Champion 1

Transcript of Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle...

Page 1: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Entrevue avec Vue.js

Ludovic Ladeu

Thomas Champion

1

Page 2: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Qui sommes nous ?

2

Ludovic Ladeu

Développeur Fullstack

Thomas Champion

Développeur Fullstack

#Back #Cloud

#Web #Web #JS

#CSS

Page 3: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Sommaire1. Pourquoi Vue ?

2. Architecture d’une application Vue

a. Les composants

b. La syntaxe de templating

3. Extensions de Vue

a. Les plugins

b. Vue router

4. Hand’s On

3

Page 4: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Pourquoi Vue ?

4

Page 5: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Histoire

5

En février 2014, Evan You publie la première version de Vue.js

"I figured, what if I could just extract the part that I really liked about Angular and build something really lightweight without all the extra concepts involved?"

Page 6: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

En trois mots

6

« Approchable »

Page 7: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

En trois mots

7

« Versatile »

Page 8: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

En trois mots

8

« Performant »

Page 9: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Une application en 30 secondes

9

Page 10: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Architecture d’une application Vue

10

Page 11: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Disclaimer

11

Les exemples de code sont en EcmaScript 6 (ES2015)

var myVar = 1; const myVar = 2;let myVar = 2;

var object = { hello: function() {

}};

const object = { hello() {

}};

var name = "bob";

var object = { name : name};

const name = "bob";

const object = { name};

Déclaration de variable

Shorthand method

Shorthand property

Page 12: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Introduction

12

Pour bootstrapper une application Vue.js :

<div id="app"> <h1>{{ title }}</h1></div>

new Vue({ el: '#app', data: { title: 'My application' }

})

Et c’est parti ?

● Un élément html● Une instance de Vue lié à cet élément

index.html main.js

Page 13: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Bonne pratique

13

Pour bootstrapper une application Vue.js :

<div id="app"></div>

new Vue({render: h => h(App)

}).$mount('#app')

● Un élément html

● Une instance de Vue et un composant racine

● Utiliser les composants

index.html

main.js

Page 14: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les composants

14

Un composant Vue est défini par un objet JS qui se décompose selon la structure suivante :

● template : template HTML du composant

const MyHeader = {template: `<h1>My application

</h1>`};

Page 15: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les composants

15

Un composant Vue est défini par un objet JS qui se décompose selon la structure suivante :

● template : template HTML du composant● data : attributs internes au composant

const MyHeader = {template: `

<h1> My application at {{ date }} </h1>`, data() { return { date: new Date().toString() }; }};

Page 16: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les composants

16

Un composant Vue est défini par un objet JS qui se décompose selon la structure suivante :

● template : template HTML du composant● data : attributs internes au composant● methods : fonctions définies dans le

composant

const MyHeader = { template: ` <h1> My application at {{ date }} - {{ hello() }} </h1>`, data() { return { date: new Date().toString() }; }, methods : { hello() { return 'hello world'; } };

Page 17: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les composants

17

Un composant Vue est défini par un objet JS qui se décompose selon la structure suivante :

● template : template HTML du composant● data : attributs internes au composant● methods : fonctions définies dans le

composant● props : attributs passés par le composant

appelant

const MyHeader = { props: ['name'], template: ` <h1> My application at {{ date }} - {{ hello() }} </h1>`, data() { return { date: new Date().toString() }; }, methods: { hello() { return `hello ${this.name}`; } }};

Page 18: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les composants

18

const MyHeader = {props: ['name'],

template: ` <h1> My application at {{ date }} - {{ hello() }} </h1>`, data() { return { date: new Date().toString() }; }, methods: { hello() { return `hello ${this.name}`; } }};

Valoriser une propriété d’un composant :

● Passer une chaîne

<my-header name="Bob"></my-header>

<my-header :name="user.name"></my-header>

<my-header :name="'Bob'"></my-header>

● Passer un objet

équivalent à

Page 19: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les composants

19

Un composant Vue est défini par un objet JS qui se décompose selon la structure suivante :

● template : template HTML du composant● data : attributs internes au composant● methods : fonctions définies dans le

composant● props : attributs passés par le composant

appelant● components : référencer les composants

qui vont être utilisé

const MyHeader = { template: ` <h1> My application at <my-time /> </h1>`, components: { MyTime }};

const MyTime = {template: `<span>{{date}}</span>`,

data() { return { date: new Date().toString() }; }};

Page 20: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Watch my property

20

Etre notifié lors la modification d’une propriété

const App = { template: ` <div>Your name : <input v-model="firstname" /></div>`,

data() { return { firstname: 'bob' } }, watch: { firstname(value, oldValue) { console.log('watch: firstname changed', value, oldValue); } }};

Page 21: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Computed property

21

● C’est une propriété composée à partir d’autres propriétés.● Elle se recalcule si ses dépendances changent avec mise en cacheconst App = { template: `<div>{{ computedFullName }} - {{ computedFullName }}</div>`, data() { return { firstname: 'bob', lastname: 'dupont' } }, computed: { computedFullName() { return this.firstname + ' ' + this.lastname; } },};

Page 22: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Démo

22

Page 23: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Communication composants

23

Un composant peut posséder des entrées-sorties.

● Les entrées sont les propriétés (props)● Les sorties correspondent à des événements

émisent par le composant enfant

Page 24: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Communication composants

24

const MyNotebook = { template: ` <div> <p>My name : <input v-model="name" /></p> <my-text :text="name" @textChanged="nameChanged" /> </div>`, data() { return { name: 'foobar', } }, methods: { nameChanged(content) { this.name = content; } }, components: { MyText }};

const MyText = { template: ` <div> <input v-model="content" /> </div>`, props: ['text'], data() { return { content: this.text } }, watch: { content() { this.$emit('textChanged', this.content); } }};

Page 25: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Le cycle de vie

25

Un composant peut aussi posséder des “hooks” pour être notifié de son cycle de vie :

Création● beforeCreated● created

Ajout au DOM● beforeMount● mounted

Mise à jour du DOM● beforeUpdate● updated

Destruction● beforeDestroy● destroyed

const MyContent = { template: `<main>{{ content }}</main>`, data() { return { content: '' } }, created() { restService.getContent() .then(content => { this.content = content; }) }};

Page 26: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Vue-cli

26

Outil qui permet de générer un projet Vuejs :

● Configuré avec webpack via vue-cli-service● Lint● Tests● Prise en charge de ES6+● Prise en charge des fichiers Vue

npm install -g @vue/cli

vue create my-project

Page 27: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les fichiers .Vue

27

Un fichier vue est composé comme suit :

● template

● script

● style (scoped ou non)

<template> <h1>{{ title }} - {{ date }}</h1></template>

<style scoped> h1 { color: blue; }</style>

<script> export default { props: ['title'], data() { return { date: new Date().toString() }; }, };</script>

Page 28: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les composants globaux

28

● Par défaut les composants utilisés doivent être importés (via la propriété components)

● Mais il est possible de créer des composants globaux :

Vue.component('box', { template: `<div class="box">{{ content }}</div>`, props: ['content']});

En déclarant le composant dans un fichier Vue :

import Box from './components/Box.vue'

Vue.component('box', Box);

Page 29: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

La syntaxe de templating

29

Page 30: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les bindings

30

Comment afficher une propriété dans mon template ?

Comment lier une propriété de mon composant à un attribut html ?

<h1>{{ title }}</h1>

<a href="https://vuejs.org/">link</a>

<a v-bind:href="myLink">link</a>

<a :href="myLink">link</a>

Page 31: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les conditions

31

<div v-if="type === 'A'"> A</div>

<div v-else-if="type === 'B'"> B</div>

<div v-else> Not A/B</div>

Page 32: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les boucles

32

<ul>

<li v-for="todo in todos">

{{ todo.text }}

</li>

</ul>

Boucler sur une liste de composants :La propriété key est obligatoire quand on utilise v-for avec les composants.

<my-component v-for="item in items"

:key=”item.id”></my-component>

Page 33: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Modèle binding

33

<script> export default { data() { return { name: 'Bob' } } }</script>

<template> <div> <p>Your name : <input v-model="name" /></p> <p>Hello {{ name }}</p> </div></template>

Page 34: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Modèle binding : modifiers

34

Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

<input v-model.trim="msg" />

<input v-model.lazy="msg" />

<input v-model.number="age" type="number" />

Il est aussi possible de combiner les modifiers :

<input v-model.trim.lazy="msg" />

Page 35: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les Extensions de Vue

35

Page 36: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Les plugins

36

● Les plugins ajoutent des fonctionnalités globales à Vue

● Il n'y a pas de portée strictement définie pour un plugin

● Il existe plusieurs types de plugins :

○ Ajout de méthodes ou propriétés globales : ex. vue-element

○ Ajout de directives / filters / transitions : ex. vue-touch

○ Ajout d’options aux composants : ex. vuex

○ Ajout de méthodes aux instances de Vue

npm install vue-router --save

Page 37: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Manage yours routes with Vue Routerimport Vue from 'vue'import App from './App'import Router from 'vue-router'

Vue.use(Router)

37

const Foo = {template: `<div>foo</div>`}const Bar = {template: `<div>bar</div>`}

const routes = [ { path: '/foo', component: Foo }, { path: '/bar', component: Bar },

]

new Vue({ render: h => h(App),router

}).$mount('#app')

const router = new Router({routes

})

1. Déclarer le plugin

2. Composants

3. Définition des routes

4. Instancier le routeur

5. Déclarer le routeur au niveau de l’application

main.js

Page 38: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Manage yours routes with Vue Router

<template> <div id="app"> <h1>My App</h1> <div> <router-link to="/foo">Link to foo</router-link> <router-link to="/bar">Link to bar</router-link> </div>

<router-view></router-view> </div></template>

38

6. Ajouter des liens et du conteneur de route

Pour aller plus loin : router.vuejs.org

App.vue

Page 39: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Questions

En attendant vous pouvez récupérer le repository :

https://github.com/xebia-france/devoxx2018-vuejs

node v6 requis (minimum) + npm install

39

Page 40: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Hand’s On

40

Page 41: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Sujet du Hand’s On

41

Nous souhaitons développer le site web SuperCook qui permet de partager ses recettes de cuisines. La création de cette application se fera en plusieurs étapes :

● Création d’un composant affichant une recette● Création d’un composant afficher une liste de recette● Création d’un composant de détail d’une recette et routage● Permettre l’ajout d’une nouvelle recette● Pouvoir enregistrer en favoris des recettes

Récupération des sources : https://github.com/xebia-france/devoxx2018-vuejs

Page 42: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Ressources

42

Page 43: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Quelques liens

43

● La documentation officielle : https://vuejs.org/v2/guide● Cheatsheet : https://vuejs-tips.github.io/cheatsheet● Bibliothèque de composants : https://vuetifyjs.com● Ultime page de ressources : https://github.com/vuejs/awesome-vue● Bonnes pratiques :

https://github.com/pablohpsilva/vuejs-component-style-guide

Page 44: Entrevue avec Vue - GitHub · Les modifiers servent à modifier les valeurs associés à un modèle avant de mettre à jour le modèle

#DevoxxFR

Astuces

44

Pour utiliser SASS :

puis au niveau de la balise style ajouter : lang=”scss”

npm install sass-loader node-sass --save-dev

<style lang="scss"> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif;

header { text-align: center; } }</style>