VueJS - Enlace
En este capítulo aprenderá cómo manipular o asignar valores a atributos HTML, cambiar el estilo y asignar clases con la ayuda de la directiva de enlace llamada v-bind disponible con VueJS.
Consideremos un ejemplo para comprender por qué necesitamos y cuándo usar la directiva v-bind para el enlace de datos.
Ejemplo
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
{{title}}<br/>
<a href = "hreflink" target = "_blank"> Click Me </a> <br/>
<a href = "{{hreflink}}" target = "_blank">Click Me </a> <br/>
<a v-bind:href = "hreflink" target = "_blank">Click Me </a> <br/>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
title : "DATA BINDING",
hreflink : "http://www.google.com"
}
});
</script>
</body>
</html>
En el ejemplo anterior, mostramos una variable de título y tres enlaces de anclaje. También hemos asignado un valor al href del objeto de datos.
Ahora, si verificamos la salida en el navegador e inspeccionamos, veremos que los dos primeros enlaces de anclaje no tienen el href correctamente como se muestra en la siguiente captura de pantalla.
El primer clickme muestra el href como hreflink, y el segundo lo muestra en {{hreflink}}, mientras que el último muestra la url correcta como requerimos.
Por lo tanto, para asignar valores a los atributos HTML, necesitamos vincularlo con la directiva v-bind de la siguiente manera.
<a v-bind:href = "hreflink" target = "_blank">Click Me </a>
VueJS también proporciona una forma abreviada de v-bind de la siguiente manera.
<a :href = "hreflink" target = "_blank">Click Me </a>
Si vemos el elemento de inspección en el navegador, la etiqueta de anclaje no muestra el atributo v-bind, sin embargo, muestra el HTML sin formato. Ninguna de las propiedades de VueJS se ve cuando insertamos el DOM.
Vinculación de clases HTML
Para vincular la clase HTML, necesitamos usar v-bind: class. Consideremos un ejemplo y vinculemos clases en él.
Ejemplo
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.active {
background: red;
}
</style>
<div id = "classbinding">
<div v-bind:class = "{active:isactive}"><b>{{title}}</b></div>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#classbinding',
data: {
title : "CLASS BINDING",
isactive : true
}
});
</script>
</body>
</html>
Hay un div creado con v-bind: class = ”{active: isactive}”.
Aquí, isactivees una variable que se basa en verdadero o falso. Aplicará la clase activa al div. En el objeto de datos, hemos asignado la variable isactive como verdadera. Hay una clase definida en el estilo..active con el color de fondo rojo.
Si la variable isactive es verdadera, el color se aplicará de lo contrario no. Lo siguiente será el resultado en el navegador.
En la pantalla de arriba, podemos ver que el color de fondo es rojo. La clase = ”activo” se aplica al div.
Ahora, cambiemos el valor de la variable a falso y veamos el resultado. La variable isactive se cambia a false como se muestra en el siguiente código.
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.active {
background: red;
}
</style>
<div id = "classbinding">
<div v-bind:class = "{active:isactive}"><b>{{title}}</b></div>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#classbinding',
data: {
title : "CLASS BINDING",
isactive : false
}
});
</script>
</body>
</html>
En la pantalla anterior, podemos ver que la clase activa no se aplica al div.
También podemos asignar varias clases a las etiquetas HTML mediante el atributo v-bind.
Ejemplo
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529B;
background-color: #BDE5F8;
}
div {
margin: 10px 0;
padding: 12px;
}
.active {
color: #4F8A10;
background-color: #DFF2BF;
}
.displayError{
color: #D8000C;
background-color: #FFBABA;
}
</style>
<div id = "classbinding">
<div class = "info" v-bind:class = "{ active: isActive, 'displayError': hasError }">
{{title}}
</div>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#classbinding',
data: {
title : "This is class binding example",
isActive : false,
hasError : false
}
});
</script>
</body>
</html>
Para el div en el código anterior, hemos aplicado una clase normal, ejemplo class = ”info”. Según la variable isActive y hasError, las otras clases se aplicarán al div.
Salida
Esta es una clase normal aplicada. Ambas variables son falsas en este momento. HagamosisActive variable a verdadero y ver la salida.
En la pantalla anterior, en el DOM podemos ver dos clases asignadas al div, info y active. Hagamos que la variable hasError sea verdadera y isActive sea falsa.
Ahora, cuando vemos en la pantalla anterior, la clase info y displayError se aplica al div. Así es como podemos aplicar varias clases en función de las condiciones.
También podemos pasar la clase como una matriz. Tomemos un ejemplo para entender esto.
Ejemplo
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529B;
background-color: #BDE5F8;
}
div {
margin: 10px 0;
padding: 12px;
font-size : 25px;
}
.active {
color: #4F8A10;
background-color: #DFF2BF;
}
.displayError{
color: #D8000C;
background-color: #FFBABA;
}
</style>
<div id = "classbinding">
<div v-bind:class = "[infoclass, errorclass]">{{title}}</div>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#classbinding',
data: {
title : "This is class binding example",
infoclass : 'info',
errorclass : 'displayError'
}
});
</script>
</body>
</html>
Salida
Como podemos ver arriba, ambas clases se aplican al div. Usemos una variable y basándonos en el valor de la variable, asignemos la clase.
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529B;
background-color: #BDE5F8;
}
div {
margin: 10px 0;
padding: 12px;
font-size : 25px;
}
.active {
color: #4F8A10;
background-color: #DFF2BF;
}
.displayError{
color: #D8000C;
background-color: #FFBABA;
}
</style>
<div id = "classbinding">
<div v-bind:class = "[isActive ? infoclass : '', haserror ? errorclass : '']">{{title}}</div>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#classbinding',
data: {
title : "This is class binding example",
infoclass : 'info',
errorclass : 'displayError',
isActive : true,
haserror : false
}
});
</script>
</body>
</html>
Hemos utilizado dos variables isActive y haserror y lo mismo se usa para el enlace div while class como se muestra en la siguiente etiqueta div.
<div v-bind:class = "[isActive ? infoclass : '', haserror ? errorclass : '']">{{title}}</div>
Si isActive es verdadero, entonces se le asignará infoclass. Lo mismo ocurre con haserror, si es cierto, solo se le aplicará errorClass.
Ahora, hagamos que la variable haserror sea verdadera y la variable isActive sea falsa.
Ahora agregaremos v-bind para clases en los componentes. En el siguiente ejemplo, hemos agregado una clase a la plantilla del componente y también al componente.
Ejemplo
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529B;
background-color: #BDE5F8;
}
div {
margin: 10px 0;
padding: 12px;
font-size : 25px;
}
.active {
color: #4F8A10;
background-color: #DFF2BF;
}
.displayError{
color: #D8000C;
background-color: #FFBABA;
}
</style>
<div id = "classbinding">
<new_component class = "active"></new_component>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#classbinding',
data: {
title : "This is class binding example",
infoclass : 'info',
errorclass : 'displayError',
isActive : false,
haserror : true
},
components:{
'new_component' : {
template : '<div class = "info">Class Binding for component</div>'
}
}
});
</script>
</body>
</html>
A continuación se muestra la salida en el navegador. Aplica ambas clases a div final.
<div class = ”info active”></div>
Agregue una variable en la sección de componentes para mostrar, basada en verdadero / falso.
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<style>
.info {
color: #00529B;
background-color: #BDE5F8;
}
div {
margin: 10px 0;
padding: 12px;
font-size : 25px;
}
.active {
color: #4F8A10;
background-color: #DFF2BF;
}
.displayError{
color: #D8000C;
background-color: #FFBABA;
}
</style>
<div id = "classbinding">
<new_component v-bind:class = "{active:isActive}"></new_component>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#classbinding',
data: {
title : "This is class binding example",
infoclass : 'info',
errorclass : 'displayError',
isActive : false,
haserror : true
},
components:{
'new_component' : {
template : '<div class = "info">Class Binding for component</div>'
}
}
});
</script>
</body>
</html>
Dado que la variable es falsa, la clase activa no se aplica y la clase de información se aplica como se muestra en la siguiente captura de pantalla.
Encuadernación de estilos en línea
Sintaxis del objeto
Example
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<div v-bind:style = "{ color: activeColor, fontSize: fontSize + 'px' }">{{title}}</div>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
title : "Inline style Binding",
activeColor: 'red',
fontSize :'30'
}
});
</script>
</body>
</html>
Output
En el ejemplo anterior, para el div, se aplica el estilo y los datos se obtienen del objeto de datos.
<div v-bind:style = "{ color: activeColor, fontSize: fontSize + 'px' }">{{title}}</div>
data: {
title : "Inline style Binding",
activeColor: 'red',
fontSize :'30'
}
También podemos hacer lo mismo asignando todos los valores a una variable y luego asignando la variable al div.
Example
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<div v-bind:style = "styleobj">{{title}}</div>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
title : "Inline style Binding",
styleobj : {
color: 'red',
fontSize :'40px'
}
}
});
</script>
</body>
</html>
El color y fontSize se asignan al objeto llamado styleobj y el mismo se asigna al div.
<div v-bind:style = "styleobj">{{title}}</div>
Output
Enlaces de entrada de formulario
Hasta ahora, en el ejemplo que hemos creado, hemos visto v-model vinculando el elemento de texto de entrada y el valor vinculado a una variable asignada. Aprendamos más sobre esto en esta sección.
Ejemplo
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<h3>TEXTBOX</h3>
<input v-model = "name" placeholder = "Enter Name" />
<h3>Name entered is : {{name}}</h3>
<hr/>
<h3>Textarea</h3>
<textarea v-model = "textmessage" placeholder = "Add Details"></textarea>
<h1><p>{{textmessage}}</p></h1>
<hr/>
<h3>Checkbox</h3>
<input type = "checkbox" id = "checkbox" v-model = "checked"> {{checked}}
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
name:'',
textmessage:'',
checked : false
}
});
</script>
</body>
</html>
Lo que escribamos en el cuadro de texto se muestra a continuación. A v-model se le asigna el nombre del valor y el nombre se muestra en {{nombre}}, que muestra lo que se escribe en el cuadro de texto.
Salida
Veamos algunos ejemplos más y cómo usarlo.
Radio y Seleccionar
Example
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<h3>Radio</h3>
<input type = "radio" id = "black" value = "Black" v-model = "picked">Black
<input type = "radio" id = "white" value = "White" v-model = "picked">White
<h3>Radio element clicked : {{picked}} </h3>
<hr/>
<h3>Select</h3>
<select v-model = "languages">
<option disabled value = "">Please select one</option>
<option>Java</option>
<option>Javascript</option>
<option>Php</option>
<option>C</option>
<option>C++</option>
</select>
<h3>Languages Selected is : {{ languages }}</h3>
<hr/>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
picked : 'White',
languages : "Java"
}
});
</script>
</body>
</html>
Output
Modificadores
Hemos utilizado tres modificadores en el ejemplo: trim, number y lazy.
Example
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<span style = "font-size:25px;">Enter Age:</span> <input v-model.number = "age" type = "number">
<br/>
<span style = "font-size:25px;">Enter Message:</span> <input v-model.lazy = "msg">
<h3>Display Message : {{msg}}</h3>
<br/>
<span style = "font-size:25px;">Enter Message : </span><input v-model.trim = "message">
<h3>Display Message : {{message}}</h3>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
age : 0,
msg: '',
message : ''
}
});
</script>
</body>
</html>
Output
Number modifierpermite ingresar solo números. No tomará ninguna otra entrada además de números.
<span style = "font-size:25px;">Enter Age:</span> <input v-model.number = "age" type = "number">
Lazy modifier mostrará el contenido presente en el cuadro de texto una vez que esté completamente ingresado y el usuario abandone el cuadro de texto.
<span style = "font-size:25px;">Enter Message:</span> <input v-model.lazy = "msg">
Trim modifier eliminará los espacios ingresados al principio y al final.
<span style = "font-size:25px;">Enter Message : </span><input v-model.trim = "message">