Prise en main et découverte **de base** (pour tester rapidement) :
## Hello World
```html
<script src="../lib/vue.js"></script>
<divid="app"></div>
<script type="text/javascript">
newVue({
el:"#app",
template:`<h1>Hello World</h1>`
});
</script>
```
Le template est dans **l'instance de Vue**
---
Idem, mais avec le template dans le DOM :
```html
<script src="../lib/vue.js"></script>
<divid="app">
<h1>Hello World</h1>
</div>
<script type="text/javascript">
newVue({
el:"#app"
});
</script>
```
---
Dans les deux cas, ça fonctionne pour des vues simples...
---
## Data binding
Vue fonctionne avec un modèle **data** qui sera automatiquement **réactif** :
```html
<divid="app">
<h1>Hello {{ who }} !!!</h1>
</div>
```
```js
varmyApp=newVue({
el:"#app",
data:{
who:"All The World"
}
});
```
Testez dans la **console** : `myApp.who = "Codeur"`
---
Pour utiliser une donnée dans un attribut, on utilise la **directive**`v-bind:attribute` :
```html
<divid="app">
<h1v-bind:title="who">Survolle moi</h1>
</div>
```
```js
newVue({
el:"#app",
data:{
who:"All The World"
}
});
```
# Sous le capot
## render
Le rendu des vues repose sur la méthode `render` :
```html
<divid="app"></div>
```
```js
newVue({
el:"#app",
data:{
msg:"Hello World"
},
render(createElement){
returncreateElement('h1',this.msg);
}
});
```
---
Le rendu est basé une un *Virtual DOM* : Optimisation, rapidité
```js
varmyApp=newVue({
el:"#app",
data(){
return{
who:"Foo"
}
},
render(createElement){
returncreateElement('p',
['Hello ',createElement('strong',this.who)," !"]
);
}
});
```
---
Les *templates* sont convertis en fonction `render(h)`, pour info, la classe **Vue** propose une méthode **compile** pour produire cette compilation :
```js
vartemplate="<h1>{{ variable }}</h1>";
console.log(Vue.compile(template));
```
---
En production / situation *rééle*, on utilise des fichiers **.vue** associés à des utilitaires **nodejs** pour obtenir du javascript compilé.
# Datas et méthodes
## data
Chaque instance dispose d'un modèle interne et *réactif* via la propriété `data` :
```js
varmyApp=newVue({
data(){
return{
foo:"Valeur FOO",
bar:"Valeur BAR",
liste:["item A","item B","item C"]
}
}
});
```
---
La clef `data` se présente souvent sous la forme d'une méthode retournant un objet de donnée pour éviter les problèmes de pointeur (plusieurs instances) :
```js
varmyApp=newVue({
data(){
return{
/* Donnèes */
}
}
});
```
---
Les propriétés *doivent être initialisées* dans l'objet `data` pour garantir leur *réactivité*.
## methods
La clef `methods` permet d'ajouter des logiques personnalisées (`this` fait référence à l'instance).
```js
varmyApp=newVue({
data(){
return{
valeur:"initiale"
}
},
methods:{
handlerRandom(){
this.valeur="Nouvelle valeur "+Math.random()
}
}
});
```
# Template
## Rendu textuel
Utilise la **syntaxe moustache** :
```html
<div>
<h1>{{ valeur }}</h1>
</div>
```
## Expression JS
Le contenu d'une *moustache* est une expression Javascript :
```html
<div>
<h1>Partie {{ nombre + 5 }}</h1>
<p>Il y'a {{ totalPersonne }}
connectée{{ totalPersonne > 1 ? 's' : '' }}</p>
</div>
```
## Attributs dynamique
Utilise la directive `v-bind:attribut` ou `:attribut` :
```html
<div>
<h1:title="valeur">{{ valeur }}</h1>
</div>
```
---
le contenu de l'attribut est une **expression Javascript** :