VueJS - Encadernação

Neste capítulo, você aprenderá como manipular ou atribuir valores aos atributos HTML, alterar o estilo e atribuir classes com a ajuda da diretiva de ligação chamada v-bind disponível com VueJS.

Vamos considerar um exemplo para entender por que precisamos e quando usar a diretiva v-bind para vinculação de dados.

Exemplo

<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>

No exemplo acima, exibimos uma variável de título e três links de âncora. Também atribuímos um valor ao href do objeto de dados.

Agora, se verificarmos a saída no navegador e inspecionarmos, veremos que os dois primeiros links de âncora não têm o href corretamente, conforme mostrado na captura de tela a seguir.

O primeiro clickme mostra o href como hreflink, e o segundo mostra em {{hreflink}}, enquanto o último mostra o url correto conforme solicitamos.

Portanto, para atribuir valores aos atributos HTML, precisamos vinculá-los à diretiva v-bind da seguinte maneira.

<a v-bind:href = "hreflink" target = "_blank">Click Me </a>

O VueJS também fornece uma abreviação para v-bind da seguinte maneira.

<a :href = "hreflink" target = "_blank">Click Me </a>

Se virmos o elemento inspect no navegador, a tag âncora não mostra o atributo v-bind, no entanto, ela exibe o HTML simples. Nenhuma das propriedades VueJS é vista quando inspecionamos o DOM.

Vinculando classes HTML

Para vincular a classe HTML, precisamos usar v-bind: class. Vamos considerar um exemplo e vincular classes nele.

Exemplo

<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>

Há uma div criada com v-bind: class = ”{active: isactive}”.

Aqui, isactiveé uma variável baseada em verdadeiro ou falso. Ele aplicará a classe ativa ao div. No objeto de dados, atribuímos a variável isativa como verdadeira. Existe uma classe definida no estilo.active com a cor de fundo vermelha.

Se a variável isactive for true, a cor será aplicada, caso contrário não. A seguir será a saída no navegador.

Na tela acima, podemos ver que a cor de fundo é vermelha. A classe = ”ativo” é aplicada ao div.

Agora, vamos alterar o valor da variável para false e ver a saída. A variável isactive é alterada para false, conforme mostrado no código a seguir.

<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>

Na tela acima, podemos ver que a classe ativa não é aplicada ao div.

Também podemos atribuir várias classes às tags HTML usando o atributo v-bind.

Exemplo

<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 a div no código acima, aplicamos uma classe normal, exemplo class = ”info”. Com base nas variáveis ​​isActive e hasError, as outras classes serão aplicadas ao div.

Resultado

Esta é uma aula normal aplicada. Ambas as variáveis ​​são falsas agora. Vamos fazerisActive variável para verdadeiro e veja a saída.

Na tela acima, no DOM, podemos ver duas classes atribuídas ao div, info e active. Vamos tornar a variável hasError verdadeira e isActive como falsa.

Agora, quando vemos na tela acima, as classes info e displayError são aplicadas ao div. É assim que podemos aplicar várias classes com base nas condições.

Também podemos passar classe como um array. Vamos dar um exemplo para entender isso.

Exemplo

<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>

Resultado

Como podemos ver acima, ambas as classes são aplicadas ao div. Vamos usar uma variável e com base no valor da variável, atribua a classe.

<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>

Nós usamos duas variáveis isActive e haserror e o mesmo é usado para a vinculação de classe div while, conforme mostrado na seguinte tag div.

<div v-bind:class = "[isActive ? infoclass : '', haserror ? errorclass : '']">{{title}}</div>

Se isActive for true, então infoclass será atribuído a ele. O mesmo vale para haserror; se for verdadeiro, apenas errorClass será aplicado a ele.

Agora, vamos definir a variável haserror como verdadeira e a variável isActive como falsa.

Agora adicionaremos v-bind para classes nos componentes. No exemplo a seguir, adicionamos uma classe ao modelo do componente e também ao componente.

Exemplo

<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 seguir está a saída no navegador. Aplica ambas as classes ao div final.

<div class = ”info active”></div>

Adicione uma variável na seção do componente para exibir, com base em verdadeiro / 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>

Como a variável é falsa, a classe ativa não é aplicada e a classe info é aplicada conforme mostrado na captura de tela a seguir.

Estilos embutidos de ligação

Sintaxe do 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

No exemplo acima, para o div, o estilo é aplicado e os dados são buscados no objeto de dados.

<div v-bind:style = "{ color: activeColor, fontSize: fontSize + 'px' }">{{title}}</div>
data: {
   title : "Inline style Binding",
   activeColor: 'red',
   fontSize :'30'
}

Também podemos fazer a mesma coisa atribuindo todos os valores a uma variável e, em seguida, atribuindo a variável ao 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>

A cor e o fontSize são atribuídos ao objeto denominado styleobj e o mesmo é atribuído ao div.

<div v-bind:style = "styleobj">{{title}}</div>

Output

Ligações de entrada de formulário

Até agora, no exemplo que criamos, vimos o modelo v vinculando o elemento de texto de entrada e o valor vinculado a uma variável atribuída. Vamos aprender mais sobre isso nesta seção.

Exemplo

<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>

Tudo o que digitarmos no texbox é exibido abaixo. O v-model recebe o nome do valor e o nome é exibido em {{name}}, que exibe tudo o que for digitado na caixa de texto.

Resultado

Vamos verificar mais alguns exemplos e como usá-los.

Radio and Select

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

Usamos três modificadores no exemplo - trim, number e 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 inserir apenas números. Não será necessária nenhuma outra entrada além de números.

<span style = "font-size:25px;">Enter Age:</span> <input v-model.number = "age" type = "number">

Lazy modifier exibirá o conteúdo presente na caixa de texto assim que for totalmente inserido e o usuário sair da caixa de texto.

<span style = "font-size:25px;">Enter Message:</span> <input v-model.lazy = "msg">

Trim modifier irá remover todos os espaços inseridos no início e no final.

<span style = "font-size:25px;">Enter Message : </span><input v-model.trim = "message">