Vue指令使用指北(一): v-bind/v-model数据绑定指令

448 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

“v-”在vue.js中称为vue指令,更明确一点,它们是vue中html标签的指令,因为它们都是应用在template中的html标签上。本文以vue.js2.x版本为例,将以四篇文章详细介绍vue指令用途和使用方法。

Vue指令使用指北(一)数据绑定指令 v-bind v-model

Vue指令使用指北(二)内容显示指令 v-text v-html v-pre v-clock

Vue指令使用指北(三)显示判断指令 v-show v-if-else

Vue指令使用指北(四)循环列表指令 v-for

1 v-bind 单向数据绑定

v-bind叫做单向数据绑定,它应用在html标签,使data里定义的变量单向绑定到html标签的某个属性值上。所谓单向,即data中的变量值影响标签属性值,反过来修改标签属性值不会修改data中的变量值,这和下一个要讲的v-model双向绑定有所区别。其语法是:

 <span v-bind:title="showText"> 鼠标放在这里,看看显示什么 </span>

同时,在data中定义变量showText:Hello Vue:

 data: {
     showText: 'Hello 掘金'
 }

那么,我们把鼠标放到span标签上的时候,就会浮现出来Hello 掘金的title。或者我们动态绑定一个标签的类名 v-bind:class="title"

 <div id="ex1" v-bind:class="title">
     Hello 掘金
 </div>

然后,定义title变量值是“my-title”

 data: {
     showText: 'Hello 掘金',
         title: 'my-title'
 }

最后,在style标签内,声明my-title类:

 my-title {
     color:red
 }

那么,html就会渲染成:

 <div id="ex1" class="my-title">
     Hello 掘金
 </div>

完整代码如下:

 
 <!DOCTYPE html>
 <html>
     <head>
         <meta charset="utf-8" />
         <title></title>
         <!-- <script src="https://unpkg.com/vue@next"></script> -->
         <script src="js/v2.6.10/vue.js" type="text/javascript" charset="utf-8"></script>
         <style type="text/css">
             #ex1 {
                 width: 200px;
                 height: 200px;
                 background-color: aqua;
             }
             .change {
                 background-color: blue !important;
             }
         </style>
     </head>
     <body>
         <div id="app">
             <!-- v-bind 可以动态修改HTML标签的属性 -->
             <span v-bind:title="showText"> 鼠标放在这里,看看显示什么 </span>
             <div id="ex1" v-bind:class="title">
                 Hello 掘金
             </div>
         </div>
         <script>
             let vm = new Vue({
                 el: '#app', 
                 data: {
                     showText: 'Hello 掘金',
                     title: 'my-title'
                 }
             });
         </script>
         <style>
             my-title {
                 color:red
             }
         </style>
     </body>
 </html>

在vue里,v-bind有一个语法糖(简写),一个冒号“:”:

 <span v-bind:title="showText"> 鼠标放在这里,看看显示什么 </span>
 <!-- 语法糖写法 -->
 <span :title="showText"> 鼠标放在这里,看看显示什么 </span>

2 v-model 双向数据绑定

v-bind不同的是,v-model 是应用在表单元素中的。所谓双向绑定指的是V和M层数据相互影响,通俗一句话你变我也变,我变你也变。狭义理解就是使用v-model 会把表单元素input、select、radio、textarea的值和data里定义变量值进行绑定。以input标签为例:

 <!-- html渲染的内容 view -->
 <input type="text" v-model="inputValue"/>

在data中定义inputValue的值:

 data: {   // model 数据
     inputValue: ''
 }

双向绑定的原理:

  • view->model:当我们在页面中的这个input里填上“掘金”两个字的时候,此时我们在打印台,打印inputValue的值,就是“掘金”两个字。
  • model->view:当我们在js脚本里,动态修改inputValue=“Hello 掘金”时,我们也会惊奇的发现页面上的input自动被“Hello 掘金”填充。

v-model原理,是一个前端面试高频题,实际上它是一个语法糖,做了两件事:

1、绑定数据inputValue

2、触发输入事件input

也就是说,v-model等同于下面这句代码:

  <input type="text" v-bind:value="inputValue" @input="inputValue=$event.target.value">

v-model通过触发input事件绑定input text元素,它还会根据不同的表单元素,调用不同的事件:

text 和 textarea 元素使用 value 属性和 input 事件;

checkbox 和 radio 使用 checked 属性和 change 事件;

select 字段将 value 作为 prop 并将 change 作为事件。

下面展示各个元素的绑定语法:

textarea 用来输入大段文字,它的用法和input一致:

 <div id="app">
     <h1>应聘登记表</h1>
     <h2>介绍一下自己:</h2>
     <textarea v-model="intro"></textarea>
 </div>
 <script src="js/v2.6.10/vue.js" type="text/javascript" charset="utf-8"></script>
 <script>
     const app = new Vue({
         el:"#app",
         data:{
             intro:''
         }
     })
 </script>

radio表示单选,具有互斥性,v-model为某一个单选选项的value值。

 <div id="app">
     <h1>应聘登记表</h1>
     <label for="front"> 
         <input type="radio" value="前端" v-model="job">男
     </label>
     <label for="back">
         <input type="radio"  value="后端" v-model="job">女
     </label>
     <h2>您应聘的岗位是:{{job}}</h2>
 </div>
 <script src="js/v2.6.10/vue.js" type="text/javascript" charset="utf-8"></script>
 <script>
     const app = new Vue({
         el:"#app",
         data:{
             job:'前端' //双向绑定,默认会勾选前端,给予checked属性
         }
     })
 </script>

checkbox有单个使用的情况,即单选,这时v-model是布尔值;多选的情况,v-model是一个数组,例如:

 <div id="app">
     <h1>应聘登记表</h1>
     <!--单选框-->
     <label for="fresh">
         <input type="checkbox" id="fresh" v-model="isFresh">是否应届毕业生
     </label>
     <h2>您选择的是:{{isFresh}}</h2>
     <hr>
     <h2>您擅长的前端框架有:{{skills}}</h2>
     <label for="">
         <input type="checkbox" value="React" v-model="skills">React
         <input type="checkbox" value="Vue" v-model="skills">Vue
         <input type="checkbox" value="Angular" v-model="skills">Angular
     </label>
 </div>
 <script src="js/v2.6.10/vue.js" type="text/javascript" charset="utf-8"></script>
 <script>
     const app = new Vue({
         el:"#app",
         data:{
             isFresh:false,//单选框
             skills:[] //多选框
         }
     })
 </script>

checkboxselect标签也拥有单选和多选两种情况,单选时,v-model的值是一个选项的value,多选时,绑定的是一个数组:

 <div id="app">
     <h1>应聘登记表</h1>
     <!--单选-->
     <h2>您的工作经验是:{{workYear}}</h2>
     <select v-model="workYear">
         <option value="应届">应届</option>
         <option value="1-3年">1-3年</option>
         <option value="3-5年">3-5年</option>
         <option value="5-8年">5-8年</option>
         <option value="老油条子">老油条子</option>
     </select>
     <hr>
     <!--多选-->
     <h2>您前端技能有:{{skills}}</h2>
     <!--使用 multiple 开启多选-->
     <select v-model="skills" multiple>
         <option value="React">React</option>
         <option value="Vue">Vue</option>
         <option value="Angular">Angular</option>
     </select>
 </div>
 ​
 <script src="js/v2.6.10/vue.js" type="text/javascript" charset="utf-8">
     <script>
         const app = new Vue({
             el:"#app",
             data:{
                 workYear:'',
                 skills:[]
             }
         })
 </script>
 ​

v-model还有三个常用的修饰符,

.lazy

在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 。你可以添加 lazy 修饰符,从而转为在 change 事件之后进行同步。

.number

如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符。

.trim

如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符。

 <div id="app">
 <!--  修饰符:lazy-->
   <input type="text" v-model.lazy="msg"><br>
   <h2>{{msg}}</h2>
 <!--  修饰符:number-->
   <input type="number" v-model.number="workYear"><br>
   <h2>您的工作年限是:{{workYear}}——{{typeof workYear}}</h2>
 <!--  修饰符:trim-->
   <input type="text" v-model.trim="youName">
   <h2>您输入的名字是:{{youName}}</h2>
 </div>
 ​
 <script src="js/v2.6.10/vue.js" type="text/javascript" charset="utf-8">
 <script>
   const app = new Vue({
     el:"#app",
     data:{
       msg:'',
       workYear:'',
       youName:''
     }
   })
 </script>

好了,vue的绑定指令v-bindv-model,我们介绍到这里。下一篇,我们谈谈内容显示指令 v-text v-html v-pre v-clock。

参考:Vue.js官网文档