Vue内置的常用指令

208 阅读3分钟

通过标签引入vue.js文件,让我们来开始了解Vue的基础语法吧!

 <script src="vue.js"></script>

除了差值表达式以外,Vue的指令是都在html标签的属性处定义。

v-text v-html

这两个指令用来控制标签在页面的显示数据,v-text会为标签按字符串的形式赋值,v-html则会将其中的字符串按html的标准解析出来。

<script>
        var app = new Vue({
            el:"#app",
            data:{
                //插入一个标签元素,对比两个指令的不同
                message: "<a href='http://www.baidu.com'>xuan</a>"
            }
        })
</script>
<div id="app">
        <h2 v-text="message + '!'">lel</h2>
        <h2 v-html="message"></h2>
    	<h2>{{message}}</h2>
</div>

输出结果如下:

v-in-1

有两点需要注意:

1.访问Vue对象的方式有两种:在指令中可以直接通过变量名访问到;指令外使用差值表达式{{}};

2.可以对拿到的数据进行二次操作。

v-on

v-on主要是为标签绑定一个具体的事件,在JavaScript中的写法是onclick、onchange等等,这个on便是取自于此。

<script>
        var app = new Vue({
            el:"#app",
            methods: {
                doIt:function(){
                    console.log("做IT");
                }
           },
        })
</script>
<div id="app">
     <input type="button" value="v-on指令" v-on:click="doIt()">
     <input type="button" value="v-on指令简化" @click="doIt()">
</div>

当点击button时,就会进行doIt()的调用,v-on: 也可以简写成@。利用v-on,我们就可以实现一个简单的MVVM模式:

<script>
        var app = new Vue({
            el:"#app",
            data:{
                value:0
            },
            methods: {
                subscribe:function(){
                    if(this.value === 0){
                        alert('到底啦.')
                    } else {
                        this.value--;
                    }
                },
                add:function(){
                    if(this.value === 10){
                        alert('最多啦.')
                    } else {
                        this.value++;
                    }
                }
            },
        })
</script>
<div id="app">
        <input type="button" value="-" @click="subscribe()">
        <span v-text="value"></span>
        <input type="button" value="+" @click="add()">
</div>

我们通过点击+ 、 -两个按钮就可以轻松控制中间value的值并显示在页面上:

v-in-2

MVVM理解

不妨来试想一下,没有vue之前我们是怎么做到的:

<div>
    <input type="button" value="-" onclick="subscribe()">
    <span id="v1">0</span>
    <input type="button" value="+" onclick="add()">
</div>
<script>
  function subscribe() {
      var spanElement = document.getElementById("v1");
      var value = spanElement.innerText;
      if(value == 0){
          alert('到底啦.')
      } else {
          value--;
      }
      spanElement.innerText = value;
  };
  function add(){
      var spanElement = document.getElementById("v1");
      var value = spanElement.innerText;
      if(value == 10){
          alert('最多啦.')
      } else {
          value++;
      }
      spanElement.innerText = value;
  }
</script>

我们通过DOM拿取到标签的值,进行操作之后,再手动的为标签设置值。这就是Vue MVVM模式的高明之处,它替我们完成了较繁琐的数据同步功能,使编码人员只需要关注具体的业务处理即可。

MVVM理念

v-show v-if

两个指令都是用来控制页面标签元素的显示状态,可以动态的隐藏或展示标签:

 <script>
        var app = new Vue({
            el:"#app",
            data:{
                food:"cake",
                isShow:true,
                age:18

            },
            methods: {
                //ES6定义函数
                change(){
                    this.isShow = !this.isShow;
                }
            },
        })
</script>
<div id="app">
        <H2 v-show="isShow" >show-{{food}}</H2>
        <H2 v-show="age>=18" >show-{{food}}</H2>

        <H2 v-if="isShow" >if-{{food}}</H2>
        <H2 v-if="age>=18" >if-{{food}}</H2>

        <!-- function不需要加()也能调用 -->
        <input type="button" value="修改" @click="change">
</div>

看一下调式台的结果就能明白二者的区别:

v-in-3

v-show是将元素的display属性设置为none,该元素还存在,只是不显示;v-if是直接不加载当前元素。

考虑到Dom树的操作比较耗费性能,如果需要频繁切换建议使用v-show。

v-bind

v-bind是为html标签动态设置属性的值,v-bind:可以简写为:。

分别为src、class属性赋值:

 <div id="app">
     <!-- 两种写法的不同 -->
     <img v-bind:src="imgSrc" :class="isActive?'active':''"  @click="change">
     <img v-bind:src="imgSrc" :class="{active:isActive}"  @click="change">

     <!-- 简写形式 -->
     <img :src="imgSrc" :class="isActive?'active':''"  @click="change">
 </div>

为isActive设置一个样式:

<style>
    .active{
         border: 4px solid red;
     }
</style>
 <script>
        var app = new Vue({
            el:"#app",
            data:{
                imgSrc:"demo1.png",
                isActive:true
            },
            methods: {
                change:function(){
                    this.isActive = !this.isActive;
                }
            },
        })
</script>

点击事件触发后,class属性获得一个isActive值,进行边框加粗:

v-in-4

轮播图实现

利用v-show、v-bind可以实现一个简单的轮播图:

    <div id="app">
       <img :src="imgArr[index]">
       <input type="button"  @click="next" value="next" v-show="index < imgArr.length - 1">
       <input type="button"  @click="prev" value="prev" v-show="index != 0">
    </div>
<script>
        var app = new Vue({
            el:"#app",
            data:{
              imgArr:['demo1.png','demo2.png','demo3.png','demo4.png'],
              index:0
            },
            methods: {
                prev:function(){
                    this.index--;
                },
                next:function(){
                    this.index++;
                }
            },
        })
</script>

v-in-5

仔细感受一下图是怎么通过改变数组变化的,在Vue中,一切的界面动态都是对数据的操作。

v-for

见名知意,对数据进行循环遍历,需要我们先定义一个数组:

<script>        var app = new Vue({            el:"#app",            data:{                vegetables:[                  {name:"xixi"},                  {name:"heihei"}                ]            }        })</script>

此处定义了一个对象数组,这也是日后前后端开发时必会的获取规则。

对于JavaScript对象和数组概念模糊,可以参考:JavaScript数据结构

<div id="app">        <ul >            <li v-for="(item,i) in vegetables">                {{i+1}}:<p>{{item.name}}</p>            </li>        </ul></div>

item表示数组中的一个元素,i则是当前元素在数组中的下标。

v-in-6

v-model

v-model是双向数据绑定最淋漓尽致的体现,用于在input标签中使用:

 <script>        var app = new Vue({            el:"#app",            data:{             message:"请你输入:"            },            methods: {            },        });		function aaa(){            alert('aaa')        } </script>
    <div id="app">       <input type="text" v-model="message">       <div>{{message}}</div>    </div>

当我们在input中输入值的时候,下面的div不需要任何触发事件就会同步显示,这样可以更直观的看到双向数据绑定的现象。

作用域问题

在上面的案例中定义一个JavaScript函数,调用情况如下:

<!-- 找不到方法,不会进行函数调用 --><input type="button" v-model="message" @click="aaa()"> <!-- 正常显示与调用 --><input type="button" v-model="message" onclick="aaa()">

使用Vue的指令会使其在Vue对象的作用域内查找,我们定义的函数是在Vue之外,自然也就看不到了。