En la lección de hoy examinaremos a fondo la directiva v-bind en combinación con los atributos class y style, los cuales nos van a permitir aprender a agregar y quitar clases y estilos de CSS de forma dinámica y reactiva utilizando por supuesto Vue.js.

Notas

En Vue.js 2 NO podemos colocar clases en nuestros elementos HTML usando interpolaciones.

<!-- Esto no funciona -->
<div v-if="vue.years < 2" class="form-group {{ descriptionError != '' ? 'has-error' : ''}}">
    ...
</div>

Especificando un objeto dentro de la directiva v-bind:class podemos agregar estilos de forma dinámica a nuestros elementos.

<!-- La clase has-error se agrega de forma dinamica dependiendo del valor de descriptionError -->
<div v-if="vue.years < 2" :class="{ 'form-group': true, 'has-error': descriptionError != null }">
    ... 
</div>

Vue nos permite combinar un atributo class dinámico (con el uso de v-bind:class o :class) y un atributo class estático. En nuestro ejemplo anterior, la clase form-group es estática (siempre estará presente), por lo tanto podemos simplificar nuestro código de la siguiente manera:

<div v-if="vue.years < 2" class="form-group" :class="{ 'has-error': descriptionError }">
    ....
</div>

:class es la versión corta de v-bind:class

El valor de la directiva :class es una expresión de JavaScript, por lo que podemos usar dentro de esta los datos que tenemos en nuestra instancia de Vue así como también nuestras computed properties:

computed: {
    ...
    descriptionFieldClasses: function () {
        return [
            'form-group', 
            { 'has-error': this.descriptionError }
        ];
    } 
}

<!-- Podemos usar una computed property dentro de la directiva :class -->
<div v-if="vue.years < 2" class="form-group" :class="{ descriptionFieldClasses }">
    ...
</div>

Vue también nos permite hacer uso de la directiva :style para definir estilos de CSS directamente en nuestros elementos HTML. Dentro de esta directiva, al igual que con la directiva :class, podemos usar computed properties, métodos o propiedades dentro del objeto data:

computed: {
    ...
    descriptionStyles: function () {
        if (this.descriptionError) {
            return { color: '#a94442' };
        }
        ...
    } 
}

<!-- Usamos nuestra computed property dentro de la directiva :style -->
<div v-if="vue.years < 2" class="form-group" :style="descriptionStyles">
    ...
</div>

Las computed properties nos sirven para organizar mejor nuestro código.

Dentro de la directiva :style también podemos hacer uso de un array que contengan objetos y Vue se encargará de combinarlos por nosotros, dándole preferencia a los objetos en las últimas posiciones del arreglo.

<div v-if="vue.years < 2" class="form-group" :style="[{color: '#44a942'}, descriptionStyles]">
    ...
</div>
Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Mostrar y ocultar elementos usando v-if y v-show con Vue.js 2 Lección siguiente Listado de elementos con v-for en Vue 2