Vue.js实战
上QQ阅读APP看书,第一时间看更新

2.2 指令与事件

指令(Directives)是Vue.js模板中最常用的一项功能,它带有前缀v-,在前文我们已经使用过不少指令了,比如v-if、v-html、v-pre等。指令的主要职责就是当其表达式的值改变时,相应地将某些行为应用到DOM上,以v-if为例:

        <div id="app">
            <p v-if="show">显示这段文本</p>
        </div>
        <script>
            var app = new Vue({
              el: '#app',
              data: {
                  show: true
              }
            })
        </script>

当数据show的值为true时,p元素会被插入,为false时则会被移除。数据驱动DOM是Vue.js的核心理念,所以不到万不得已时不要主动操作DOM,你只需要维护好数据,DOM的事Vue会帮你优雅的处理。

Vue.js内置了很多指令,帮助我们快速完成常见的DOM操作,比如循环渲染、显示与隐藏等。在第5章会详细地介绍这些内置指令,但在此之前,你需要先知道v-bind和v-on。

v-bind的基本用途是动态更新HTML元素上的属性,比如id、class等,例如下面几个示例:

        <div id="app">
            <a v-bind:href="url">链接</a>
            <img v-bind:src="imgUrl">
        </div>
        <script>
            var app = new Vue({
              el: '#app',
              data: {
                  url: 'https://www.github.com',
                  imgUrl: 'http://xxx.xxx.xx/img.png'
              }
            })
        </script>

示例中的链接地址与图片的地址都与数据进行了绑定,当通过各种方式改变数据时,链接和图片都会自动更新。上述示例渲染后的结果为:

        <a href="https://www.github.com">链接</a>
        <img src="http://xxx.xxx.xx/img.png">

以上是介绍v-bind最基本的用法,它在Vue.js组件中还有着重要的作用,将在第4章和第7章中详细介绍。

另一个非常重要的指令就是v-on,它用来绑定事件监听器,这样我们就可以做一些交互了,先来看下面的示例:

        <div id="app">
            <p v-if="show">这是一段文本</p>
            <button v-on:click="handleClose">点击隐藏</button>
        </div>
        <script>
            var app = new Vue({
              el: '#app',
              data: {
                  show: true
              },
              methods: {
                  handleClose: function () {
                      this.show = false;
                  }
              }
            })
        </script>

在button按钮上,使用v-on:click给该元素绑定了一个点击事件,在普通元素上,v-on可以监听原生的DOM事件,除了click外,还有dblclick、keyup、mousemove等。表达式可以是一个方法名,这些方法都写在Vue实例的methods属性内,并且是函数的形式,函数内的this指向的是当前Vue实例本身,因此可以直接使用this.xxx的形式来访问或修改数据,如示例中的this.show =false;把数据show修改为了false,所以点击按钮时,文本p元素就被移除了。

表达式除了方法名,也可以直接是一个内联语句,上例也可以改写为:

        <div id="app">
            <p v-if="show">这是一段文本</p>
            <button v-on:click="show = false">点击隐藏</button>
        </div>
        <script>
            var app = new Vue({
              el: '#app',
              data: {
                  show: true
              }
          })
        </script>

如果绑定的事件要处理复杂的业务逻辑,建议还是在methods里声明一个方法,这样可读性更强也好维护。

Vue.js将methods里的方法也代理了,所以也可以像访问Vue数据那样来调用方法:

        <div id="app">
            <p v-if="show">这是一段文本</p>
            <button v-on:click="handleClose">点击隐藏</button>
        </div>
        <script>
            var app = new Vue({
              el: '#app',
              data: {
                  show: true
              },
              methods: {
                  handleClose: function () {
                      this.close();
                  },
                  close: function () {
                      this.show = false;
                  }
              }
            })
        </script>

在handleClose方法内,直接通过this.close()调用了close()函数。在上面示例中是多此一举的,只是用于演示它的用法,在业务中会经常用到,例如以下几种用法都是正确的:

        <script>
            var app = new Vue({
              el: '#app',
              data: {
                  show: true
              },
              methods: {
                  init: function (text) {
                      console.log(text);
                  }
              },
              mounted: function () {
                  this.init(’在初始化时调用’);  //在初始化时调用
              }
          });

          app.init(’通过外部调用’);   //在Vue实例外部调用
        </script>

更多关于v-on事件的用法将会在第7章中详细介绍。