v-on(@)

事件绑定-基本使用

使用v-on给标签绑定事件。

web端网页应用程序开发,事件是一个不可或缺的技术。

在vue中给元素进行事件绑定,需要通过v-on:指令实现,也使用@符号,@是v-on:的简写,使用更方便。

事件类型

  1. 鼠标事件:onclick ondblclick onmouseenter onmouseleave onmouseover onmousedown等等。
  2. 键盘事件:onkeyup onkeydown onkeypress 等等。

语法

<tag v-on:事件类型="事件处理驱动"></tag>

<!-- @符号,简便用法,推荐使用-->
<tag @事件类型="事件处理驱动"></tag>  

<div @click="事件处理驱动"></tag>

<script>
var vm new Vue({
  el:xx
  data:xx,
  // 给当前vue实例声明方法,以供事件调用
  methods:{
    名称:function(){},
    名称(){}
  }
})
</script>

注意

  1. 事件处理驱动需要通过methods定义。
  2. 被绑定的事件类型可以是 click、dblclick、keyup、keydown等等,不需要设置on标志。

案例

<div id="app">
    <h2>事件操控</h2>
    <button v-on:click="say()">说</button>
    
    <!--@是 v-on: 的简写,推荐使用,记住-->
    <button @click="say()">说</button>
  </div>

  <script src="./vue.js"></script>
  <script>
    var vm = new Vue({
      el:'#app',
      data:{
      },
      // 给Vue实例声明方法,该方法可以给事件使用
      methods:{
        say(){
          console.log('hello,北京')
        }
      }
    })
  </script>

事件绑定-传递参数

vue“单击”事件参数的3种类型:

  1. 有声明(),也有传递实参,形参就代表被传递的实参
  2. 有声明(),但是没有传递实参,形参就是undefined
  3. 没有声明(),第一个形参就是事件对象 [object MouseEvent/鼠标事件对象]。
  1. 由于事件类型不一样,参数所代表的事件对象也会不同。

案例

<div id="app">
    <h2>事件操控</h2>
    <p><button @click="delA(301)">删除A</button></p>
    <p><button @click="delB()">删除B</button></p>
    <p><button @click="delC">删除C</button></p>
  </div>

  <script src="./vue.js"></script>
  <script>
    var vm = new Vue({
      el:'#app',
      methods:{
        delA(id){
          console.log('id为'+id+'的商品被删除了')  // 301
        },
        delB(id){
          console.log('id为'+id+'的商品被删除了')  // undefined
        },
        delC(id){
          console.log('id为'+id+'的商品被删除了')  // [object MouseEvent/鼠标事件对象]
        }
      }
    })
  </script>

事件绑定-访问data成员

根据业务需要,事件在执行过程中需要对Vue实例的data数据进行操作,通过this关键字实现。

this代表Vue实例对象,并且针对data或methods成员都可以直接进行调用。

案例

给data声明address成员,值为“铁岭”。

设置按钮,使得单击后控制台可以输出“铁岭是一个大城市”。

<button @click="getInfo()" >获取数据</button>

<script>
  var vm = new Vue({
    el:'#app',
    data:{
      address:'铁岭'
    },
    methods:{
      getInfo:function(){
        // 通过 this关键字 获得 data区域的数据信息
        console.log(this.address+'是一个大城市');
      }
    }
  })
</script>

事件绑定-this指向

在Vue实例内部包括不限于methods方法中,this关键字Vue实例化对象,具体与 new Vue() 是一样的,并且其可以对 datamethods成员进行直接访问。

可以理解为this和vm是同一个对象的两个不同名字,this === vm

<div id="app">
    <h2>事件操控</h2>
    <p><button @click="say()">说</button></p>
  </div>

  <script src="./vue.js"></script>
  <script>
    var vm = new Vue({
      el:'#app',
      data:{
        city:'北京'
      },
      methods:{
        say(){
          console.log(this) // 是对象,具体是new Vue()的对象,构造器是Vue
          // 外部的vm也是Vue实例化对象
          // this 和 vm  是同一个Vue实例化对象的两个不同步名字而已,它们全等于
          console.log(this === vm) // true
          // (实例化对象的构造函数 new XXX,XXX就是当前实例化出来对象的构造器)
          console.log(this.city)
          console.log(this.say2())
        },
        say2(){return 1234}
      }
    })
  </script>

注意

this 与 vm 的指引完全一致,它们可以通过===判断等于(是同一个实体对象的两个不同名字而已)。

一般this指向

  1. this指向window对象
var age = 20
function getInfo(){
  console.log(this)  // window
  console.log(this.age)
}
getInfo()  // 20
  1. this代表调用该方法的当前对象
const tiger = {
  name:'东北虎', 
  act:'猛虎扑食', 
  say(){
    console.log('我的名字是'+this.name+',我的招牌动作是'+this.act)
    // this代表tiger对象
  }
}
tiger.say()
  1. this代表元素节点对象
<button onclick="this.style.color='red'" />确定</button>

注意

this在不同情况下代表不同对象,通过console.log输出查看便知。

事件绑定-方法简易设置

对象中成员方法可以把 :function去除,做简易设置,是es6的标准规范。

具体设置

根据es6标准,可以给methods各个方法做简易设置如下:

<script>
    var vm = new Vue({
      el:'#app',
      methods:{
        // 对象成员方法简易设置  方法名称:function(){}  简易设置为:   方法名称(){}
          delA:function(id){
              console.log('id为'+id+'的商品被删除了')  
          },
          delA(id){
          	 console.log('id为'+id+'的商品被删除了')  
          }
      }
    })
  </script>

原理

es6标准里边规定,对象成员名称值的变量名称 保持一致,就可以做简易设置:

  1. 对象属性简易设置如下:
var name = "xiaoqiang"
var height = 176
var run = function(){
  console.log('在跑步')
}

var person = {name:name,height:height,run:run}		// 正常创建对象
var person = {name, height, run}				   // 简便方式创建对象
  1. 对象成员方法简易设置如下:
var obj = {
  // walk:function(){
  //   console.log('走直线')
  // }
  // 变形
  // walk:function walk(){
  //   console.log('走直线')
  // }
  // 简易设置为如下:
  walk(){
    console.log('走直线')
  }
}

给一个对象直接声明一个成员方法,也可以简写为如上形式,去除: function字。