Développement web avancé
Séance 2
Vue.js ?
- Framework Javascript
- "Réactif"
- Orienté composant
- Forte communauté
- Coeur du framework léger (30Ko)
- Librairies officielles
Concepts étudiés
- Variables réactives
- Directives
- Évènements et méthodes
- Hooks du cycle de vie
- Composants
- Single File Components
- Router
Page HTML & JavaScript
Objet Vue principal (new Vue(...))
- Template
- Données (variables)
- Méthodes
- Logique
<html> <head>
</head> </html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Introduction à Vue.js</title>
</head>
<body>
<div id="app">
{{ message }}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
new Vue({
el: "#app",
data: {
message: "Hello World!"
}
})
</script>
</body>
</html>
Objet options
{
el: '#app',
data: {}
methods: {}
mounted() {}
computed: {}
}
Données réactives 1/2
<div id="app">
{{ message }}
</div>
<script>
const vm = new Vue({
...,
data: {
message: "Hello World!"
}
})
vm.message = "Hello Novaa"
Données réactives 2/2
<div id="app">
<span v-bind:title="message">{{ message }}</span>
</div>
<script>
const vm = new Vue({
...,
data: {
message: "Hello World!"
}
})
vm.message = "Hello Novaa"
Directives v-*
<p v-if="display">On me voit</p>
<p v-else>On me voit plus</p>
<p v-show="display">On me voit</p>
<ul>
<li v-for="movie in movies">{{ movie }}</li>
</ul>
<ul>
<li v-for="movie in movies" v-bind:key="movie.title">
{{ movie.title }}
</li>
</ul>
<button v-on:click="clickMethod">Submit form</button>
<button v-on:click.prevent="clickMethod">Submit form</button>
<input type="text" v-model="message" />
{{message}}
...
<script>
new Vue({
...,
data: {
message: "Hello"
}
})
</script>
Methods
new Vue({
el: "#app",
data: {
counter: 0
},
methods: {
increment() {
this.counter++
}
}
})
<div id="app">
{{ counter }} <button v-on:click="increment">Increment</button>
</div>
new Vue({
el: "#app",
data: {
counter: 0
},
methods: {
increment(step) {
this.counter+=step
}
}
})
<div id="app">
{{ counter }} <button v-on:click="increment(4)">Increment</button>
</div>
Computed properties
<div id="app">
<input type="text" v-model="message" /><br />
{{ message }}<br />
{{ message_reversed }}
</div>
new Vue({
el: "#app",
data: {
message: "Hello World"
},
computed: {
message_reversed() {
return this.message.split('').reverse().join('')
}
}
})
Cycle de vie
d'un composant
new Vue({
el: "#app",
mounted() {
console.log("Mounted")
},
destroyed() {
console.log("Destroyed")
}
})
Composants
Vue
<div id="app">
<todo-item></todo-item>
</div>
Vue.component('todo-item', {
template: '<li>Préparer mes slides</li>'
})
new Vue({
el: "#app"
})
<div id="app">
<todo-item todo="Préparer mes slides"></todo-item>
</div>
Vue.component('todo-item', {
props: ["todo"],
template: '<li>{{todo}}</li>'
})
new Vue({
el: "#app"
})
<div id="app">
<todo-item v-bind:todo="message"></todo-item>
</div>
Vue.component('todo-item', {
props: ["todo"],
template: '<li>{{todo}}</li>'
})
new Vue({
el: "#app",
data: {
message: "Hello world"
}
})
<div id="app">
<todo-item v-bind:todo="message"
v-on:btnclicked="btnClickedHandler"></todo-item>
</div>
Vue.component('todo-item', {
props: ["todo"],
template: `<li>{{todo}}
<button v-on:click="btnClicked">Click me</button></li>`,
methods: {
btnClicked() {
this.$emit('btnclicked')
}
}
})
new Vue({
el: "#app",
data: {
message: "Hello world"
},
methods: {
btnClickedHandler() {
console.log("Button todo clicked")
}
}
})
Demo time
TD 2
https://scleriot.github.io/web-dawin/
Développement web avancé - Séance 2
By Simon Cleriot
Développement web avancé - Séance 2
- 615