Cours 1: introduction à Vue.js
Cours 2: Style (Bulma & class-binding)
Cours 3: Client-side routing
Cours 4: Rest, promises, ouverture
On est maintenant capable de
{{ maProp }} v-bind:href="maProp" ou
:href="maProp"v-if,v-elseif et v-elsev-for="e in array" v-bind:key="e.id">v-on:click="method" ou @click="method"Qu'est ce qu'il manque à notre application pour être montrable ?
😎 Du style (parce que là c'est affreux)
⌛ Un peu de pratique (créer nos propres composants)
C'est l'objectif de notre séance
Dans Vue, la balise style accepte plusieurs langages: css, sass, less, scss...
Il est préférable d'utiliser un langage de haut-niveau (e.g. less ou scss) plutôt que css directement.
Sass, less, scss apportent des notions utiles (héritage, mixins etc...) tout en compilant vers du css derrière.
Dans ce cours, on utilisera du css pour rester accessible à tous, mais vous êtes invités à utiliser scss ou less par exemple sur de "vrais" projets.
Plutôt que de devoir faire tout notre style à la main et gérer le responsive nous-même, j'aimerais utiliser un framework css.
Connaissez-vous des frameworks CSS fournissant des briques responsives par défaut ?
→ Bulma, tailwindcss, Bootstrap...
tailwindcss est très populaire, je suis personnellement un fan de Bulma & Buefy (libraire Vue au-dessus de Bulma)
Bulma est un framework css qui, une fois ajouté à votre projet Vue, va rendre disponible plein de classes css utilitaires.
Vous pourrez ainsi facilement gérer les polices, les tailles et la disposition responsive, le dark-mode, les animations...
npm install bulma
(tout le monde sait ce que fait npm install ?)
--save est inutile depuis npm 5.0)
Un autre dévelopeur qui clone le repo n'aura qu'à faire npm install pour avoir toutes les dépendances listées dans le package.json
npm install bulma
Si on avait le temps de détailler : installer le scss via webpack
Ici on se contentera d'ajouter bulma.css à notre index.html
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css" />
On peut maintenant utiliser les classes bulma.
<Composter />
.card et également la classe .button)Une des contraintes du développement Web/mobile est d'avoir à gérer des résolutions multiples avec des ratios hétérogènes (mobile portait/paysage, tablette, laptop, desktop, widescreen...)
Il existe de très nombreuses approches pour gérer le responsive. Voyons un exemple simple basé sur Bulma.
Un bon moyen de faire du reponsive simple est de structurer son site en colonnes.
Bulma fournit des classes pour facilement gérer un tel découpage: les columns.
Un container de colonnes doit avoir la classe columns
Il contient autant d'élement column que souhaité
Par défaut, bulma fera en sorte que les colonnes aient une taille égale, sauf sur mobile où chaque colonne prend toute la largeur.
Vous avez la main sur la taille des colonnes, penser à ajouter is-multiline
si vous souhaitez autoriser le container columns à prendre plus d'une ligne quand la somme des tailles dépasse 100%
Moitié de l‘écran
Un quart de l‘écran
Un autre quart de l‘écran
Un tiers, nouvelle ligne créée
commit : Bulma columns - size example
Vous pouvez définir des tailles différentes selon la résolution (c'est tout l'intérêt).
5 breakpoints définis par défaut:
5 breakpoints définis par défaut:
Quart de l‘écran desktop, Moitié tablet
Quart de l‘écran desktop, Moitié tablet
Tiers de l‘écran desktop, Tiers tablet
Un quart dans tous les cas sauf sur widescreen
commit : Bulma columns - size example (responsive)
Pour éviter l'aspect "massif" sur grande résolution, sur beaucoup de sites, on voit une taille au-delà de laquelle le contenu ne s'étire plus, on fixe une taille maximale et on se contente de centrer.
Vous pouvez ajouter la classe "container" pour fixer la taille au-delà d'une certaine résolution (voir toutes les options possible ici)
commit : Bulma add container
Réaliser les développments nécessaires à l'obtention de cette vidéo :
Imaginons que je souhaites changer la façon d'afficher le titre dans le template
Composter {{ composterId }}
En affichant un message différent selon que l'id soit pair ou non
Composter {{ composterId }} {{ (composterId %2 == 0) ? 'pair' : 'impair'}}
{{ 'Composter ' + composterId + ((composterId %2 == 0) ? 'pair' : 'impair') }}
{{ 'Composter ' + composterId + ((composterId %2 == 0) ? 'pair' : 'impair') }}
Imaginons que je souhaite afficher ce nom à plusieurs endroits et que je le copie-colle plusieurs fois dans mon template.
Quels problèmes ce copier-coller pose-t-il ?
Il nous faudrait un mécanisme qui permet :
componentTitle){{ componentTitle }})Il nous faudrait un mécanisme qui permet :
componentTitle){{ componentTitle }})C'est la définition d'une computed property VueJS
C'est la définition d'une computed property VueJS
export default {
name: "Composter",
props: {
composterId: String
},
computed: {
componentTitle() {
let evenOrOdd = 'impair'
if (this.composterId %2 == 0) {
evenOrOdd = 'pair'
}
return 'Composter ' + this.composterId + ' (' + evenOrOdd + ')'
}
}
}
export default {
name: "Composter",
props: {
composterId: String
},
computed: {
componentTitle() {
let evenOrOdd = 'impair'
if (this.composterId %2 == 0) {
evenOrOdd = 'pair'
}
return 'Composter ' + this.composterId + ' (' + evenOrOdd + ')'
}
}
}
componentTitle est une computed Property, utilisable n'importe où dans le template et rafraîchie uniquement si un des props/datas utilisés dans le calcul changent.
isOpen ne soit plus une data mais une computed property (vraie si id est impair, faux sinon)La différence entre un composteur ouvert ou fermé n'est pas flagrante...
On aimerait que le css de la carte change de couleur en fonction de isOpen
<div class="card"
style="background-color: #A6D785;border: 2px solid #3B5E2B;">
<div class="card"
style="background-color: #F5F5F5;border: 2px dashed #C0C0C0;">
<div class="card"
style="background-color: #A6D785;border: 2px solid #3B5E2B;">
<div class="card"
style="background-color: #F5F5F5;border: 2px dashed #C0C0C0;">
Comment faire changer le style avec les mécanismes déjà vus ?
v-if n'est pas adapté car on veut changer la valeur de l'attribut style pas masquer la divv-bind semble parfait, style est un attribut ! Essayonsv-bind semble parfait, style est un attribut ! Essayons:style="{
backgroundColor: isOpen ? '#A6D785' : '#F5F5F5',
borderColor: isOpen ? '#3B5E2B' : '#C0C0C0',
borderStyle: isOpen ? 'solid' : 'dashed',
borderWidth: '2px'
}">
À noter que l'on peut utiliser n'importe quelle data/prop :
borderWidth: composterId + 'px'
commit : Style binding example
Utiliser :style fonctionne parfaitement, et sera approprié dans certains usages
Mais dans notre exemple, ce serait bien plus propre de définir deux classes CSS .composter-opened et .composter-closed
Mais dans notre exemple, ce serait bien plus propre de définir deux classes CSS .composter-opened et .composter-closed
Ajoutons une balise <style> après
<template> et <script>
Utilisons une nouvelle fois v-bind pour binder une ou plusieurs classes en fonction de conditions
<div class="card" :class="{
'composter-opened': isOpen,
'composter-closed': !isOpen
}">
commit : Class binding example
.card-image pour que le curseur soit pointer si il y a plus de 5 horaires d'ouvertures
On est maintenant capable
.cards...)columnscomputed properties pour factoriser des calculsv-bind sur les classes et le style pour effectuer du styling dynamique en fonction des props/datasQu'est ce qu'il manque à notre application pour être montrable ?
☰ Un menu et une structure en différentes pages
🌐 Aller chercher des vraies données depuis un serveur REST
C'est l'objectif de notre séance