! : Créer un squelette html
Nom des composants en spinal-case
npm init -y
npm install lite-server
Ouvrir :
package.json
Chercher :
"test": "echo \"Error: no test specified\" && exit 1"
Remplacer par :
"test": "echo \"Error: no test specified\" && exit 1",
"start": "lite-server"
npm start
http://localhost:3000
{{ donnee }}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue JS Playground</title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
<div id="mon-app">
<h1>Vue JS Cours</h1>
</div>
<script>
new Vue ({
el : '#mon-app'
})
</script>
</body>
</html>
<div id="mon-app">
{{ txt }}
</div>
<script>
new Vue ({
el : '#mon-app',
data: {
txt: 'Hello World'
}
})
</script>
<div id="mon-app">
{{ presentation() }}
</div>
<script>
new Vue ({
el : '#mon-app',
data: {
txt: 'Hello World'
},
methods: {
presentation: function () {
return 'Bonjour, je suis Sam'
}
}
})
</script>
<div id="mon-app">
{{ presentation() }}
</div>
<script>
new Vue ({
el : '#mon-app',
data: {
txt: 'Hello World'
},
methods: {
presentation: function () {
return this.txt;
}
}
})
</script>
<div id="mon-app">
<a v-bind:href="url">test</a><br>
<a :href="url">test</a><br
<img v-bind:src="url">
</div>
<script>
new Vue ({
el : '#mon-app',
data: {
url: 'http://test.fr'
},
})
</script>
<img v-bind:src="url">
Raccourci :
<img :src="url">
Appel une méthode lors d'un event
<div id="mon-app">
<button v-on:click="augmente">Augmente</button>
{{ compteur }}
</div>
<script>
new Vue ({
el : '#mon-app',
data: {
compteur: 0,
},
methods: {
augmente : function () {
this.compteur++;
}
}
})
</script>
<button v-on:click="augmente">Augmente</button>
Raccourci :
<button @click="augmente">Augmente</button>
Exécute 1 fois :
<button v-on:click.once="augmente">Augmente</button>
Stop la propagation :
<button v-on:click.stop="augmente">Augmente</button>
Stop le comportement par défaut :
<form v-on:submit.prevent="onSubmit">
<div v-once>{{ nombre }}</div> // n'augmente pas
<div >{{ nombre }}</div>
<button v-on:click="augmente">Augmente</button>
Lance la fonction quand appuyé sur [Entrée]
<input type="text" v-on:keyup.enter="inputFunc">
Two-ways data binding
<body>
<div id="mon-app">
<input type="text" v-model="valeur">
{{ valeur }}
</div>
</body>
<script>
new Vue ({
el : '#mon-app',
data: {
valeur : "",
},
})
</script>
Two-ways data binding
<div id="mon-app">
{{ selection }}
<select v-model="selection">
<option>Paris</option>
<option>Londre</option>
</select>
</div>
<script>
new Vue ({
el : '#mon-app',
data: {
selection : "",
},
})
</script>
<div id="mon-app">
<div style="white-space: pre-line">
{{ multi }}
</div>
<textarea v-model="multi" cols="40" rows="7"></textarea>
</div>
<script>
new Vue ({
el : '#mon-app',
data: {
multi : "",
},
})
</script>
<div id="mon-app">
<input type="text" v-model="tex1" v-on:keyup="recopie()">
<input type="text" v-bind="tex2">
</div>
<script>
new Vue ({
el : '#mon-app',
data: {
tex1 : "",
tex2 : "",
},
methods: {
recopie: function () {
this.text2 = this.text1.toUpperCase();
}
}
})
</script>
<div id="mon-app">
<input type="checkbox" value="html" v-model="cases">html
<input type="checkbox" value="css" v-model="cases">css
</div>
{{ cases }}
<script>
new Vue ({
el : '#mon-app',
data: {
cases : [],
},
})
</script>
<div id="mon-app">
<input type="radio" value="html" v-model="cases">html
<input type="radio" value="css" v-model="cases">css
</div>
{{ cases }}
<script>
new Vue ({
el : '#mon-app',
data: {
cases : "",
},
})
</script>
<p v-html="htmlBrut"></p>
data: {
htmlBrut: "<b>sdfsdf</b>",
},
{{ checkValeur() }}
Si la valeur compteur change alors appelle la méthode memo()
{{ memo }}
<script>
new Vue ({
el : '#mon-app',
data: {
compteur: 0,
},
methods: {
}
},
computed : {
memo: function () {
console.log("change valeur")
}
})
</script>
Ou
<div>{{texteMaj}}</div>
data: {
TexteMaj: 'Samuel Gondouin',
},
computed : {
TexteMaj: function () {
return this.texte.toUpperCase();
}
Surveille une valeur
{{ compteur }}
<button v-on:click="compteur++">Inc</button>
data: {
compteur: 0,
},
watch : {
compteur: function (valeur) {
if(this.compteur == 10) {
console.log("change valeur");
this.compteur = 0;
}
}
}
CSS dans div ============
<div v-bind:class="{ red : toggleColor}" >
data: {
toggleColor: true,
},
Ou
<div v-bind:class="{ myCSS, red : toggleColor}" >
data: {
toggleColor: true,
myCSS : true
},
Ou
<div v-bind:class="objCSS" >
data: {
toggleColor: true,
},
computed: {
objCSS: function() {
return {
red: this.toggleColor,
myCSS: true
}
}
}
<div v-bind:class="[objCSS, 'otherClass']" >
<p :style="{color : 'blue'}">
ou
<p :style="{backgroundColor : 'blue'}">
ou
<p :style="{myStyle}">
computed: {
myStyle: function() {
return {
backgroundColor : this.myColor,
width: this.myWidth + "px"
}
}
}
<button v-on:click="toggleButton = !toggleButton">toggle</button>
<div v-if="toggleButton" class="box red"></div>
<p v-else="toggleButton">Sinon<>
Ou
<p v-if="num === 1">valeur 1</p>
<p v-else-if="num === 2">valeur 2</p>
<p v-else-if="num === 3">valeur 3</p>
<p v-else>autre valeur</p>
<template v-if="toggleButton">
TEXT
</template>
<ul>
<li v-for="number in tableau"> {{ number }} </li>
</ul>
data {
tableau : [1, 2, 3]
}
<div v-for="(elem, index) in elems">
{{ elems }}
<button v-on:click="supprimer(index)">Supprime</button>
</div>
data {
elems : ["premier", "deuxieme"]
},
methods : {
supprimer: function(index) {
this.elems.splice(index,1);
}
}
<ul>
<li v-for="(texte, index) in tableau"> {{ index }} {{ texte }} </li>
</ul>
data {
tableau : ["aa", "bb", "cc"]
}
<ul>
<li v-for="(val, props) in tableau"> {{ props }} : {{ val }} </li>
</ul>
data {
objetChat : {
race : "persan",
age : 3,
poids : "3 kg"
}
}
<ul>
<li v-for="obj in objetChat">
<div v-for="(val, props) in obj"> {{ props }} : {{ val }} </div>
</li>
</ul>
data {
objetChat : [
{race : "persan", age : 3, poids : "3 kg"},
{race : "test", age : 3, poids : "3 kg"},
{race : "coucou", age : 3, poids : "3 kg"},
]
}
<script>
const instance1 = new Vue ({
el : '#mon-app1',
data: {
text: 'coucou1'
},
})
const instance2 = new Vue ({
el : '#mon-app2',
data: {
},
methods : {
changeTexte: function () {
instance1.texte = "Nouveau texte"
}
}
})
</script>
<div id="mon-app1">
<mon-premier-composant></mon-premier-composant> ou <mon-premier-composant/>
</div>
<script>
Vue.component('mon-premier-composant', {
template: '<p>Texte du composant {{ nom }}</p>',
data: function() {
return {
nom : "Prenom Nom"
},
methods: {
}
})
const instance1 = new Vue ({
el : '#mon-app1',
data: {
text: 'coucou1'
},
})
</script>
ou
<div id="mon-app1">
<MonPremierComposant></MonPremierComposant> ou <MonPremierComposant/>
</div>
<script>
Vue.component('MonPremierComposant', {
template: '<p>Texte du composant {{ nom }}</p>',
data: function() {
return {
nom : "Prenom Nom"
},
methods: {
}
})
const instance1 = new Vue ({
el : '#mon-app1',
data: {
text: 'coucou1'
},
})
</script>
<div id="app">
<comp texte="Samuel"></comp>
</div>
<script>
Vue.component('comp', {
props: ['texte'],
template: '<div>Bonjour {{ texte }} </div>'
}),
const instance = new Vue ({
el : '#app,
})
</script>
Ou
<div id="app">
<comp texte="Samuel"></comp>
</div>
<script>
Vue.component('comp', {
props: ['texte'],
template: '<div>Bonjour {{ texte1 }} </div>',
data: function () {
return {
texte1 = this.texte
}
}
}),
const instance = new Vue ({
el : '#app,
})
</script>
vue create my-project
components/Contenu.vue :
<template>
{{ txt }}
</template>
<script>
export default {
data: function () { ou data() {
return txt : 'coucou'
}
}
</script>
<style>
</style>
main.js :
import Contenu from 'components/Contenu.vue'
Vue.compontent('contenu', Contenu)
App.vue :
<template>
<contenu></contenu>
</template>
Ou
components/Contenu.vue :
<template>
{{ txt }}
</template>
<script>
export default {
name: 'Contenu'
data() {
return txt : 'coucou'
}
}
</script>
<style>
</style>
App.vue :
<template>
<contenu></contenu>
</template>
<script>
import Contenu from 'components/Contenu.vue'
export default {
name: 'App',
components: {
'contenu': Contenu
}
}
</script>
<style scoped src="mycss.css">
</style>
Enfant :
<template>
{{ prenom }}
</template>
<script>
export default {
props: ['prenom'] <= Va recevoir 'prenom'
}
</script>
Parent :
<script>
<enfant v-bind:prenom="prenom"></enfant>
export default {
name: 'App',
data() {
return {
prenom : 'sam'
}
}
}
</script>
Parent :
<template>
{{ titre }}
<div v-on:changeTitre="changementTitre($event)">change titre</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
titre : 'sam'
}
},
methods: {
changementTitre: function(nouveauTitre) {
this.titre = nouveauTitre
}
}
}
</script>
Enfant :
<template>
<div v-on:click="changeTitre">change titre</div>
</template>
<script>
props: ['prenom'],
methods: {
changeTitre: function() {
this.$emit('changeTitre', 'mon nouveau titre')
}
}
</script>
<template>
{{ reversing() }}
</template>
<script>
props: ['prenom'],
methods: {
reversing: function() {
return this.prenom.split('').reverse().join('')
}
}
</script>
<script>
export default {
created() {
}
}
<div id="mon-app">
<input type="text" v-model="nom">
<input type="button" v-model="Clique" v-on:click="traitement">
</div>
{{ cases }}
<script>
new Vue ({
el : '#mon-app',
data: {
nom : '',
},
methods: {
traitement: function() {
alert('bonjour ' + this.nom);
}
})
</script>
<div id="mon-app">
<input type="text" v-model="nom">
<input type="button" v-model="Clique" v-on:click="traitement('Bonjour')">
</div>
{{ cases }}
<script>
new Vue ({
el : '#mon-app',
data: {
nom : '',
},
methods: {
traitement: function(texte) {
alert(text + ' ' + this.nom);
}
})
</script>
{{ ey }}
<img src="image.jpg" v-on:mousemove="coord($event)">
data: {
xy : '',
},
methods: {
coord: function(ev) {
this.xy = 'x= ' + ev.offsetX + ', y= ' ev.offsetY;
}
<div v-on:keydown="actionParent">
<input type="text" v-on:keydown="action($event)>
</div>
methods: {
action: function(ev) {
console.log("input");
ev.preventDefault(); // n'effetue pas le traitement pas défaut : N'affiche rien
ev.stopPropagation(); // Ne propage rien vers les parents
},
actionParent: function() {
console.log("Event propage");
},
ou
<div v-on:keydown="actionParent">
<input type="text" v-on:keydown.prevent.stop="action($event)>
</div>
methods: {
action: function(ev) {
console.log("input");
},
actionParent: function() {
console.log("Event propage");
},
Event Modifier preventDefault et stopPropagation ================================================
<form>
<input type="number" v-model="nombre">
<input type="submit" v-on:click="carre($event)">
</form>
methods: {
carre: function(ev) {
ev.preventDefault(); // n'effetue pas le traitement pas défaut : Ne vas pas recharger la page
this.nombre = this.nombre * this.nombre;
},
<img src="image.jpg" v-bind:width="larg" v-on:click.left="largeur(300)">
data: {
larg : 100,
},
methods: {
largeur: function(lar) {
this.lar = lar;
}
<element v-on:[evenement]="traitement"></element>
<element v-bind:[attribut]="valeur"></element>
Soit : Sélectionne le type de click pour changer l'image
<input type="radio" value="click" v-model="choix" checked>Simple clic
<input type="radio" value="doubleclick" v-model="choix" checked>double clic
<img v-bind:src="adresse' v-on:[choix]="change" width="400">
data: {
adresse: 'image/chat.jpg',
choix: 'click'
},
methods: {
change: function() {
if(this.adresse.indexOf('chat') != -1 ) {
this.adresse = "image/chat.jpg";
} else {
this.adresse = "image/chien.jpg";
}
}
<ul v-for="personne in personnes">
<li>{{personne.nom}} {{personne.prenom}}</li>
</ul>
data: {
personnes : [
{prenom: 'Samuel', nom: 'Gondouin'},
{prenom: 'Chloé', nom: 'Poirier'},
],
},
<input type="text" v-model="texte" v-on:keyup="action($event)">
<input type="button" value="Clique" v-on:click="action($event)">
methods: {
action: function() {
if( ev.key == 'Enter' || ev.type == 'click' ) {
this.texte = this.texte.toUpperCase();
}
}
<style>
.rouge {
color: red;
}
.taille {
font-weight: bold;
}
</style>
<div v-bind:class="{rouge: test, taille: test1}">texte</div>
data: {
test: false,
test1: true
},
<div v-if="cond1">
contenu 1
</div>
<div v-else-if="cond2">
contenu 2
</div>
<div v-else="cond3">
contenu 3
</div>
<div v-else>
contenu 4
</div>
Ou
<div v-show="condition">
<div id="app">
<input type="text" v-model="texte">
<div>{{ texte | capglobal}}</div>
<div>{{ texte | capglocal}}</div>
</div>
<script>
Vue.filter('capglobal', function(valeur) {
return valeur.toUpperCase()
})
new Vue ({
el : '#app',
data: {
texte: '',
},
filters: {
caplocal: function(valeur) {
return valeur.toUpperCase()
}
}
})
</script>