52
Vue, j’avais pas vu ! Bruno Bonnin - @_bruno_b_ #codeurs2016

Vue, j’avais pas vu !

Embed Size (px)

Citation preview

Page 1: Vue, j’avais pas vu !

Vue, j’avais pas vu !Bruno Bonnin - @_bruno_b_

#codeurs2016

Page 2: Vue, j’avais pas vu !

Kissuije ?

Bruno Bonnin @_bruno_b_ - 24 novembre

Architecte logiciel / Développeur @MyScript

#Java #JavaScript #Python #MongoDB #Elastisearch # NoSQL #Hadoop #Spark #Storm #BigData #HTML5 #AngularJS #VueJS #NodeJS

De plus en plus !De moins en moins...

Page 3: Vue, j’avais pas vu !

MyScript

Leader de la reconnaissance d’écriture

Démo: http://webdemo.myscript.com/

Join us: http://myscript.com/about/join-us/

Page 4: Vue, j’avais pas vu !

Java ServerPages

Un passé sombre...

Page 5: Vue, j’avais pas vu !

Heureusement…

Page 6: Vue, j’avais pas vu !

Et maintenant, que vais-je faireeeeeeuh ?

Page 7: Vue, j’avais pas vu !
Page 8: Vue, j’avais pas vu !

Orienté composantsDédié à la création d’interfaces Web interactives

Performant

Très facile à apprendre

Vue.js en quelques mots...

Focus sur la couche View

Flexible

Page 9: Vue, j’avais pas vu !

npm install vue-cli -gvue init webpack mon-projet

C’est parti, on l’installe...

<script src="https://unpkg.com/vue/dist/vue.js">Le plus simple

Recommandé npm install vue

Encore mieux

Page 10: Vue, j’avais pas vu !

… et on code !

<div id="app">

Bonjour {{ name }} !

</div>

var vm = new Vue({

el: '#app',

data: confdata

})

var confdata = {

name: 'Codeurs en

Seine'

}

Model ViewViewModel

confdata.name = 'BreizhCamp' Rien de plus à faire !

?

Page 11: Vue, j’avais pas vu !

Démo(merci de votre tolérance concernant le style…)

Page 12: Vue, j’avais pas vu !

Commençons par ...

Data binding, interpolation, properties

Page 13: Vue, j’avais pas vu !

<span>{{ name | capitalize }}</span>

Interpolation

<h1>Bonjour {{ name }} !</h1>

{{ ... }}<h1 v-once>Bonjour {{ name }} !</h1>

<span>{{ name.toLowerCase() }}</span>

<p>{{ resultat === 1 ? ‘OK’ : ‘KO’ }}</p>

Filter => défini dans l’instance de Vue

Page 14: Vue, j’avais pas vu !

Interpolation sur les attributs

v-bind <a v-bind:href="search_url"> Search </a>

<div v-bind:id=" ’id’ + nb"> </div>

<span :title="message"> </span>

<a href="{{ search_url }}"> Search</a>

Page 15: Vue, j’avais pas vu !

<div>{{ speakers.sort().join(‘, ‘) }}</div>

<script>new Vue({ el: '#app', data: { speakers: [ 'Grincheux', ‘Prof’] }

})</script>

,computed: { allSpeakers () { return this.speakers.sort().join(‘, ‘)}

Computed properties

allSpeakers

Props en cache !

{{ ... }}

Page 16: Vue, j’avais pas vu !

Watched properties

new Vue({ data: { firstname: 'Archibald', lastname: 'Haddock', fullname: '' }, watch: { firstname (val) { this.fullname = val + ‘ ‘ + this.lastname }, lastname (val) { this.fullname = this.firstname + ‘ ‘ + val } }})

Peut être coûteux !Préférez les computed props

computed: { fullname () { return this.firstname + ‘ ‘ + this.lastname}

Page 17: Vue, j’avais pas vu !

Démo(juste pour voir les properties)

Page 18: Vue, j’avais pas vu !

Continuons avec …

Les directives v-*

Page 19: Vue, j’avais pas vu !

Directives

Attributs commençant par v-

Avec un argument

Avec des modificateurs

<input v-model="name">

<a v-bind:href="search_url"> Search </a>

<input v-model.trim="name" type="text">

<form v-on:submit.prevent="updateData">

Page 20: Vue, j’avais pas vu !

Two-way binding

<span>Hello {{ name }} !</span><input v-model="name">

<script>new Vue({ el: '#app',

data: { name: 'world' }})</script>

v-model

Page 21: Vue, j’avais pas vu !

Evénements DOM

<h3> Talk: {{ title }} </h3><button v-on:click="like"> J’aime </button>

<script>new Vue({ data: { title: "BeerScript, le langage pour l’apéro" }, methods: { like (event) { … }, }})</script>

v-on

Page 22: Vue, j’avais pas vu !

Conditional rendering

<h3> Talk: {{ title }} </h3><div v-if="like"> Vous aimez ça ! </div>

<script>new Vue({ data: { title: "Pourquoi Angular3 ne supportera que le VBScript", like: true }})</script>

v-ifv-else

<div v-else> Vous n’aimez pas </div>

Page 23: Vue, j’avais pas vu !

List rendering

<div v-for="talk in talks"> <h3>{{ talk.title }}</h3></div>

<script>new Vue({ data: { talks: [ { "title": "..." }, { "title": "..." } ] }})</script>

v-for

Peut être une computed prop ou une méthode

Page 24: Vue, j’avais pas vu !

Custom directive

<button v-bigbutton:success> Yes ! </button>

v- ...<script> Vue.directive({ ‘bigbutton’, {

bind (el, binding, vnode) { el.classList = 'btn btn-lg btn-' + binding.arg }}})</script>

Page 25: Vue, j’avais pas vu !

Démo(cette fois, le style est top !)

Page 26: Vue, j’avais pas vu !

Transition

<transition name="fade"> <p v-if="showTheBook"> <img src="..." /> </p></transition>

<style>.fade-enter-active, .fade-leave-active { transition: opacity .8s}.fade-enter, .fade-leave-active { opacity: 0}</style>

Page 27: Vue, j’avais pas vu !

Poursuivons avec …

La classe Vue

Page 28: Vue, j’avais pas vu !

Une instance "Vue"

new Vue({

el: '#app',

template: '', data: { … },

computed: { ... },

watch: { ... },

methods: { ... },

filters: { … }, // {{ name | capitalize }}

// Méthodes liées au // cycle de vie de l’instance created () { … }, mounted () { … }, beforeUpdate () { … }, updated () { … } ...

})

Page 29: Vue, j’avais pas vu !

Cycle de vie

Source: https://vuejs.org/v2/guide/instance.html

Page 30: Vue, j’avais pas vu !

Et maintenant...

Les composants

Page 31: Vue, j’avais pas vu !

Les composants

Extension des éléments HTML de base pour construire des éléments réutilisable

<talks> ... ... ... ... </talks>

Page 32: Vue, j’avais pas vu !

Les composants

<template id="talks-template"> <div v-for='talk in talks'> {{ talk.title }} </div></template>

new Vue({ el: '#app', data: { talks: [ { title: '...' }, { title: '...' } ] }})

Vue.component('talks', { template: '#talks-template', props: [ 'talks' ]})

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

Page 33: Vue, j’avais pas vu !

Le tout en un

=.CSS.HTML .JS .VUE++

Page 34: Vue, j’avais pas vu !

Composants: .vue

<div class="talks"> <div class="talk" v-for="talk in talks"> <h3 class="talk-title">{{ talk.titre }}</h3> </div> </div>

export default { name: 'talks', props: [ 'talks' ], methods: { ... }}

.talks { margin: 0 50px;}

.HTML

.JS

.CSS

Page 35: Vue, j’avais pas vu !

Composants: .vue

<template> <div class="talks"> <div class="talk" v-for="talk in talks"> <h3 class="talk-title">{{ talk.titre }}</h3> </div> </div></template>

<script>export default { name: 'talks', props: [ 'talks' ], methods: { ... }}</script>

<style scoped>.talks { margin: 0 50px;}</style>

.VUE

Page 36: Vue, j’avais pas vu !

Démo(si ça marche, tournée générale...)

Page 37: Vue, j’avais pas vu !

Vue-router

Et y a quoi d’autres ?

Page 38: Vue, j’avais pas vu !

Vue-router

<div id=”#app”> <router-link to=”/talks” tag=”button”> Talks </router-link> <router-link to=”/speakers” tag=”button”> Speakers </router-link> <router-view></router-view></div>

Page 39: Vue, j’avais pas vu !

Vue-router

const routes = [ { path: '/talks', name: 'talks', component: require('./TalkList.vue') }, { path: '/talk/:id', components: { default: require('./Talk.vue'), nav: require('./Nav.vue') } }, { path: '*', redirect: '/talks' }]

import Vue from 'vue'import VueRouter from 'vue-router'

Vue.use(VueRouter)

const router = new VueRouter({ mode: 'history', routes : routes})

new Vue({ el: '#app', router : router})

Page 40: Vue, j’avais pas vu !

Démo(grosse sérénité sur cette démo...)

Page 41: Vue, j’avais pas vu !

Vuex

Et y a quoi d’autres ?

Page 42: Vue, j’avais pas vu !

Vuex

Source: https://vuex.vuejs.org

Gestion centralisé de state pour tous les composants d’une application

Inspiré par Flux

Page 43: Vue, j’avais pas vu !

Création du store

const store = new Vuex.Store({

mutations: { setTalks (state, talks) { state.talks = talks } },

state: { talks: [] },

getters: { afternoonTalks: state => { return state.talks.filter(...) } },

actions: { fetchTalks ({ commit }) => { api.fetchTalks() .then(res => commit(’setTalks’, res.data)) } }

Page 44: Vue, j’avais pas vu !

Utilisation du store

import { mapState } from 'vuex'

new Vue({ store : store,

created () { this.$store.dispatch('fetchTalks') // Action invoquée pour avoir // les data à la création de la Vue },

computed: mapState([ // Helper pour créer des accès au state 'talks' // Equivalent this.$store.state.talks ]),}

Page 45: Vue, j’avais pas vu !

Démo(et après, c’est fini !!!)

Page 46: Vue, j’avais pas vu !

Vue-devtools

Et y a quoi d’autres ?

Page 47: Vue, j’avais pas vu !

Vue-devtools - Components

Page 48: Vue, j’avais pas vu !

Vue-devtools - Vuex

Page 49: Vue, j’avais pas vu !

https://github.com/vuejs/awesome-vue

Et y a quoi d’autres ?

Page 50: Vue, j’avais pas vu !

En conclusion...

Après 2 ans d’existence, la communauté grandit vite

● Focus sur la simplicité ● Orienté composant● Montée en compétence

très rapide (des connaissances standards en JavaScript et HTML suffisent)

Vue.js doit faire partie de votre réflexion !

Source: https://github-ranking.com/

Page 51: Vue, j’avais pas vu !

Merci !

@_bruno_b_

https://github.com/bbonnin/codeursenseine2016

Page 52: Vue, j’avais pas vu !