Please wait, while our marmots are preparing the hot chocolate…
# @chunk: chunks/title.md
# Questions ?
Commentaires ? {no-print}
# @chunk: chunks/objectives.md
## Programmation Web Avancée {var-cours-n} : Plan {#plan overview}
- Questions Vue ? {rappelvue}
- Questions REST ? {rappelrest}
- Client REST JSON en Vue {restjs}
- Écosystème vue {vueeco}
# @copy:#plan
# @copy:#plan: %+class:inred: .rappelvue
## Pourquoi Vue ? (dans ce cours) {libyli}
- Framework intéressant
- complet
- utilisé
- documentations dans plusieurs languages
- vs Angular
- 2 versions d'Angular
- Angular utilise typescript (proche de Spring etc)
- nous voulons apprendre/pratiquer javascript
- vs React.js
- react troublant avec : JSX, CSS, objet JS
- problème de licence dans React ?
- hum... août 2017 _
- ok (MIT) en septembre 2017
# slides précédents {no-print}
# @copy:#plan: %+class:inred: .rappelrest
# slides précédents {no-print}
# @copy:#plan: %+class:inred: .restjs
# Accès à l'API github avec Vue
## Accès « REST » avec Vue et vue-resource {libyli}
- En *vue*, utilisation de `vue-resource`
- inclure `vue-resource.js` l'intègre automatiquement dans vue
- une fonction pour chaque *méthode*
- HTTP (GET⇒get(), DELETE⇒delete(), ..., POST⇒save())
- utilisation de « promesses » (*promises*)
- Mode 1: `this.$http`
```javascript
this.$http.get('https://......../1')
.then(response => {
// OK: get body data from response.body
}, response => {
// ERROR: ...
});
{slide dense}
```
- Mode 2: constructeur `this.$resource` (configurable)
```javascript
var r = this.$resource('http://........{/id}')
r.get({id: 1}).then(response => {
// OK: get body data
}, response => {
// ERROR: ...
});
{slide dense}
```
## Accès à l'API github avec Vue {libyli}
- API Github (v3)
- infos d'un utilisateur :
- `https://api.github.com/users/???????` {no}
- dépots d'un utilisateur :
- `https://api.github.com/users/???????/repos` {no}
- dépots en particulier :
- `https://api.github.com/repos/??USER??/??REPO??` {no}
- ...
- C'est parti ! {libyli}
- inclure vue et vue-resource
- récupérer les infos d'une repository
- afficher ces infos
- `name`, `description`, `owner` (`login`, `avatar_url`)
- un « cache » dans le « local storage »
- `JSON.parse(localStorage.getItem('....'))`
- `localStorage.setItem('....', JSON.stringify(...))`
## Accès à l'API github avec Vue (Suite) {libyli}
- C'est l'heure du picnic !
- Un composant `repo`
- Un composant `user` ?
- Plusieurs utilisateurs // USERS: "tifa90 SachaCo Tsompani BelaihouMohamed AbdelilahChet Kahi-Na MNour7 SouleymaneNianfo Touaibia khameds Raiden70 DavyUVD dimitribruyere Echyx ChrisJeamme"
- requêtes en parallèle
- `Promise.all(...)`
- Multicolonnes
- `columns: 4 ; column-rule: 1px solid black`
## Accès à notre server Spring {libyli}
- Rappel : hotels
- entité Hotel (name, nrooms), repository
- accessible en « REST » JSON sur `/api`, par ex, GET `/api/hotels`
```javascript
{
"_embedded": {
"hotels": [
{
"name": "ibis",
...
{slide denser}
```
- TODO : ajouter des données (sur `/data`)
- Un client en Vue (afficher la liste)
- NB: client sur une autre url : *Cross-origin resource sharing* (CORS)
- CORS: 2 solutions, cf stackoverflow
- CORS: solution concise : ajouter `@CrossOrigin("*")` à la repo
- Ajout depuis Vue
- binding `newHotel: {name: "H", nrooms: 10}{}`
- POST ⇒ `.save(...)`
## Accès à notre server Spring (suite) {libyli}
- Ajout : ne pas devoir rafraichir
- ajout direct, validation/invalidation selon la requête
- astuces JS + Vue (changer et **rafraichir**)
```javascript
# js : copier un objet et changer/ajouter des propriétées
var nouv = {...existant, nouvprop: 'bidule'};
# modifier un élément d une liste
nouv.truc = "machin"
this.hotels = [...this.hotels]
# ajouter dans une liste
this.hotels = [...this.hotels, nouv]
# enlever d une liste
this.hotels = this.hotels.filter(h => h!==nouv)
# remplacer dans une liste
this.hotels = this.hotels.map(h => h!==nouv ? h : nouvnouv)
{slide dense}
```
- Supprimer un hotel
- HATEOAS : `...$http.delete(h._links.self.href)`
# @copy:#plan: %+class:inred: .vueeco
## Aller plus loin avec Vue {libyli}
- Vue cli (command line interface)
- https://vuejs.org/v2/guide/installation.html#CLI
- pour générer des projets à partir de templates
- et outils js « usine à gaz » (webpack, babel, ...)
- Vue router
- https://router.vuejs.org/en/
- https://router.vuejs.org/fr/
- Vuex
- https://vuex.vuejs.org/en/
- https://vuex.vuejs.org/fr/
- Applications natives avec Vue.js ?
- Weex https://weex.incubator.apache.org/
- Nativescript+Vue https://nativescript-vue.org/
/ − will be replaced by the author − will be replaced by the title