# Liaisons de classe et de style

Un besoin courant de liaison de données consiste à manipuler la liste de classes d'un élément et ses styles inligne. Comme ce sont tous les deux des attributs, nous pouvons utiliser v-bind pour les gérer: nous n'avons besoin que de calculer une chaîne caractère finale avec nos expressions. Cependant, mêler de la concaténation de chaînes caractères est ennuyeux et sujet aux erreurs. Pour cette raison, Vue fournit des améliorations spéciales lorsque v-bind est utilisé avec class et style. En plus des chaînes de caractère, les expressions peuvent également s'évaluer en objets ou en tableaux.

# Liaison de classe HTML

# Syntaxe d'Objet

Nous pouvons passer un objet à :class (abréviation de v-bind:class) pour basculer dynamiquement entre les classes:

<div :class="{ active: isActive }"></div>
1

La syntaxe ci-dessus signifie que la présence de la classe «active» sera déterminée par la véracité (opens new window) de la propriété isActive.

Vous pouvez faire basculer plusieurs classes en ayant plus de champs dans l'objet. De plus, la directive :class peut également coexister avec l'attribut class. Donc, étant donné le template suivant:

<div
  class="static"
  :class="{ active: isActive, 'text-danger': hasError }"
></div>
1
2
3
4

Et les données suivantes:

data() {
  return {
    isActive: true,
    hasError: false
  }
}
1
2
3
4
5
6

Le rendu sera:

<div class="static active"></div>
1

Lorsque isActive ou hasError change, la liste des classes sera mise à jour en conséquence. Par exemple, si hasError devient true, la liste de classes deviendra "static active text-danger".

L'objet lié n'a pas besoin d'être inline:

<div :class="classObject"></div>
1
data() {
  return {
    classObject: {
      active: true,
      'text-danger': false
    }
  }
}
1
2
3
4
5
6
7
8

Cela rendra le même résultat. On peut également se lier à une propriété computed qui renvoie un objet. C'est un pattern commun et puissant:

<div :class="classObject"></div>
1
data() {
  return {
    isActive: true,
    error: null
  }
},
computed: {
  classObject() {
    return {
      active: this.isActive && !this.error,
      'text-danger': this.error && this.error.type === 'fatal'
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# Syntaxe de tableau []

Nous pouvons passer un tableau à :class pour appliquer une liste de classes:

<div :class="[activeClass, errorClass]"></div>
1
data() {
  return {
    activeClass: 'active',
    errorClass: 'text-danger'
  }
}
1
2
3
4
5
6

Le rendu sera:

<div class="active text-danger"></div>
1

Si vous souhaitez également basculer (toggle) conditionnellement une classe dans la liste, vous pouvez le faire avec une expression ternaire:

<div :class="[isActive ? activeClass : '', errorClass]"></div>
1

Cela s'appliquera toujours à errorClass, mais n'appliquera à activeClass que lorsque isActive est vrai.

Cependant, cela peut être un peu détaillé si vous avez plusieurs classes conditionnelles. C'est pourquoi il est également possible d'utiliser la syntaxe d'objet dans la syntaxe de tableau:

<div :class="[{ active: isActive }, errorClass]"></div>
1

# Avec les composants

Cette section considère que vous connaissez déjà les composants Vue. N'hésitez pas à l'ignorer et à revenir plus tard.

Lorsque vous utilisez l'attribut class sur un composant personnalisé avec un seul élément racine, ces classes seront ajoutées à cet élément. Les classes existantes sur cet élément ne seront pas écrasées.

Par exemple, si vous déclarez ce composant:

const app = Vue.createApp({})

app.component('my-component', {
  template: `<p class="foo bar">Hi!</p>`
})
1
2
3
4
5

Ensuite, ajoutez quelques classes lors de son utilisation:

<div id="app">
  <my-component class="baz boo"></my-component>
</div>
1
2
3

Le rendu HTML sera:

<p class="foo bar baz boo">Hi</p>
1

Pareil pour les liaisons de classe:

<my-component :class="{ active: isActive }"></my-component>
1

Lorsque isActive est vrai, le HTML rendu sera:

<p class="foo bar active">Hi</p>
1

Si votre composant a plusieurs éléments racine, vous devez définir quel composant recevra cette classe. Vous pouvez le faire en utilisant la propriété du composant $attrs:

<div id="app">
  <my-component class="baz"></my-component>
</div>
1
2
3
const app = Vue.createApp({})

app.component('my-component', {
  template: `
    <p :class="$attrs.class">Hi!</p>
    <span>Ceci est un composant enfant</span>
  `
})
1
2
3
4
5
6
7
8

Vous pouvez en savoir plus sur l'héritage des attributs des composants dans la section Attributs non-prop.

# Liaisons de styles inline

# Syntaxe d'Object

La syntaxe d'objet pour :style est assez simple - elle ressemble presque au CSS, sauf que c'est un objet JavaScript. Vous pouvez utiliser camelCase ou kebab-case (utilisez des guillemets avec kebab-case) pour les noms de propriété CSS:

<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
1
data() {
  return {
    activeColor: 'red',
    fontSize: 30
  }
}
1
2
3
4
5
6

Il est souvent judicieux de lier directement à un objet de style pour que le template soit plus propre:

<div :style="styleObject"></div>
1
data() {
  return {
    styleObject: {
      color: 'red',
      fontSize: '13px'
    }
  }
}
1
2
3
4
5
6
7
8

Là encore, la syntaxe d'objet est souvent utilisée conjointement avec des propriétés computed qui renvoient des objets.

# Syntaxe de Tableau

La syntaxe de tableau pour : style vous permet d'appliquer plusieurs objets de style au même élément:

<div :style="[baseStyles, overridingStyles]"></div>
1

# Auto-prefixage

Lorsque vous utilisez une propriété CSS qui requiert les préfixes du fournisseur (opens new window) dans :style, par exemple transform, Vue détectera et ajoutera automatiquement les préfixes appropriés aux styles appliqués.

# Valeurs Multiples

Vous pouvez fournir un tableau de plusieurs valeurs (préfixées) à une propriété de style, par exemple:

<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
1

Cela ne rendra que la dernière valeur du tableau que le navigateur prend en charge. Dans cet exemple, il affichera display: flex pour les navigateurs qui prennent en charge la version sans préfixe de flexbox.

Deployed on Netlify.
Dernière Mise-à-jour: 1/23/2021, 10:18:31 PM