Vue.js ofrece dos tipos de binding, unidireccional y bidireccional. En este tutorial vamos a ver el binding unidireccional, que se realiza con la directiva v-bind
.
El binding es un concepto existente en muchos frameworks y tecnologías, que nos permite mantener sincronizado el valor de dos variables.
En Vue.js el binding no va a permitir conectar los datos de la JavaScript con el HTML. Es decir, nos permite utilizar variables de la lógica en el HTML.
Unido a la reactividad, el binding nos permite crear aplicaciones dinámicas donde los cambios en los datos se reflejan automáticamente en la vista.
En el próximo tutorial veremos el binding bidireccional, que se realiza con elementos de formulario y la directiva v-model
.
Directiva v-bind
En Vue.js, v-bind
es la directiva que nos permite realizar un binding unidireccional, que nos permite enlazar dinámicamente atributos HTML o propiedades de componentes con datos de la instancia de Vue.
Es decir, podemos hacer que cualquier atributo del HTML (como src
, href
, class
, o style
), dependa de una variable o expresión reactiva.
El binding de atributos ocurre siempre desde los datos en el JavaScript hacia el HTML (pero no permite que los datos se modifiquen desde el HTML).
La sintaxis de la directiva es poner v-bind
, seguida de dos puntos :
y nombre del atributo que queremos bindear (v-bind
Por ejemplo, asi
<template>
<img v-bind:src="imageUrl" alt="Imagen dinámica">
</template>
<script setup>
import { ref } from 'vue';
const imageUrl = ref('https://imagenesinventadas.com/luisllamas.jpg');
</script>
En este ejemplo:
- El atributo
src
de la imagen está enlazado a la variableimageUrl
. - Si
imageUrl
cambia, el atributosrc
se actualizará automáticamente.
Alias simplificado
El binding de atributos es tan frecuente Vue proporciona un alias simplificado usando los dos puntos (:).
<!-- esto es equivalente -->
<a :href="enlaceUrl">Visita Vue.js</a>
<!-- a esto -->
<a v-bind:href="enlaceUrl">Visita Vue.js</a>
Es decir, que el ejemplo anterior normalmente lo escribiríamos así,
<template>
<!-- usamos simplemente : -->
<img :src="imageUrl" alt="Imagen dinámica">
</template>
<script setup>
import { ref } from 'vue';
const imageUrl = ref('https://imagenesinventadas.com/luisllamas.jpg');
</script>
En general, esta es la sintaxis que vais a utilizar siempre (no hay ninguna ventaja en poner el v-bind delante).
Binding de clases y estilos
El binding de atributos también nos permite vincular estilos o clases de manera dinámica (no dejan de ser atributos sin mas).
Usaremos esto frecuentemente para dar estilo dinámicamente a nuestros componentes. Por ejemplo,
<template>
<div :class="{ activo: isActive }" :style="{ color: textColor }">
Este es un texto dinámico
</div>
</template>
<script setup>
import { ref } from 'vue';
const isActive = ref(true);
const textColor = ref('red');
</script>
En este ejemplo,
- La clase
activo
se aplica siisActive
estrue
- El color del texto se establece dinámicamente con
textColor
.
Uso de v-bind
en nuestros componentes Avanzado
También podemos v-bind
en para pasar datos a un componentes hijo, junto con lo que llamamos Props (lo veremos al hablar de componentes).
<template>
<div>
<p>Nombre: {{ name }}</p>
<p>Edad: {{ age }}</p>
</div>
</template>
<script setup>
defineProps({
name: String,
age: Number,
});
</script>
<template>
<ChildComponent :name="userName" :age="userAge" />
</template>
<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
const userName = ref('Juan');
const userAge = ref(25);
</script>
En este ejemplo:
- El componente padre pasa las props
name
yage
al componente hijo usandov-bind
. - El componente hijo recibe las props y las muestra en su template.