04-vue的事件处理器

Posted Ultraman_agul

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04-vue的事件处理器相关的知识,希望对你有一定的参考价值。

vue事件处理器

1.1 @click=“handleClick”

不加小括号的事件处理方式,vue会自动传递事件对象,可以在事件处理函数中获取事件对象,但是无法传递自定义的参数

 <div id="box">
     count
     <br>
     <button @click="handleClick">事件处理-自动传递事件对象-无法传递参数</button>
 </div>
 <script>
     var vm = new Vue(
         el:"#box",
         data:
             count:0
         ,
         methods:
             handleClick(eve)
                 this.count++;
             
         
     )
 </script>

1.2 @click=“handleClick($event,2)”

e v e n t : 固 定 写 法 , 手 动 传 递 , v u e 会 根 据 传 递 的 event:固定写法,手动传递,vue会根据传递的 event:vueevent参数获知需要传递的事件对象,自定义的参数传递从第二个参数开始。

<div id="box">
    count
    <br>
    <button @click="handleClick($event,2)">事件处理-手动传递事件对象-传递参数</button>
</div>
<script>
    var vm = new Vue(
        el:"#box",
        data:
            count:0
        ,
        methods:
            handleClick(eve,data)
                console.log(eve.target)
                this.count += data;
            
        
    )
</script>

1.3 直接在行内事件指令中书写代码

在行内写代码,这种方式一般不会使用

<div id="box">
   count
   <br>
   <button @click="count+=3">直接在行内事件指令中书写代码</button>
</div>
<script>
   var vm = new Vue(
       el:"#box",
       data:
           count:0
       
   )
</script>

1.4 事件修饰符:

  • .stop:阻止事件冒泡

    阻止冒泡:在vue中子父级都绑定了同一事件,如原生一样会有事件冒泡行为

    原生js使用e.stopPropagation()阻止事件冒泡

<div id="box">
   <div @click="divClick">
       <button @click="butClick">事件冒泡</button>
   </div>
</div>
<script>
   var vm = new Vue(
       el:"#box",
       data:,
       methods:
           divClick()
               console.log("divClick");
           ,
           butClick(eve)
               //原生方式实现阻止冒泡
               eve.stopPropagation();
               console.log("butClick");
           
       
   )

​ vue中使用事件修饰符实现阻止冒泡行为

​ 事件修饰符 .stop阻止冒泡

<div id="box">
    <div @click="divClick">
        <!-- 事件修饰符.stop阻止事件冒泡 -->
        <button @click.stop="butClick">事件冒泡</button>
    </div>
</div>
<script>
    var vm = new Vue(
        el:"#box",
        data:,
        methods:
            divClick()
                console.log("divClick");
            ,
            butClick()
                console.log("butClick");
            
        
    )
</script>

案例:模态框的显示隐藏

<div id="box">
  <!-- @click="isShow=true"点击时显示main -->
  <button @click="isShow=true">show</button>
  <!-- @click="isShow=false"点击时main区域时,main隐藏 -->
  <div class="main" v-show="isShow" @click="isShow=false">
      <!-- 在container上需要使用@click.stop来阻止冒泡,否则当用鼠标在文本框中点击获取焦点时,会冒泡触发main中的点击操作 -->
      <div class="container" @click.stop>
          <p>用户名:<input type="text"></p>
          <p>&emsp;码:<input type="password"></p>
          <hr>
          <p><button>登录</button</p>
      </div>
  </div>
</div>
<script>
  var vm = new Vue(
      el : "#box",
      data : 
          isShow : false
      
  )
</script>
  • .prevent:阻止默认行为
<a href="http://www.baidu.com" @click.prevent>跳转</a>
  • .self :只在当前元素上点击才触发事件,可以无需使用@click.stop就达到阻止事件冒泡的效果

上面的显示模态框案例可以作如下修改

<div id="box">
 <!-- @click="isShow=true"点击时显示main -->
 <button @click="isShow=true">show</button>
 <!-- 
     @click="isShow=false"点击时main区域时,main隐藏 
     @click.self="isShow=false":事件指令后加上self修饰符表示只有点击在当前元素上才会触发事件,在其它元素上点击,不会触发该事件
 -->
 <div class="main" v-show="isShow" @click.self="isShow=false">
     <div class="container">
         <p>用户名:<input type="text"></p>
         <p>&emsp;码:<input type="password"></p>
         <hr>
         <p><button>登录</button</p>
     </div>
 </div>
</div>
<script>
 var vm = new Vue(
     el : "#box",
     data : 
         isShow : false
     
 )
</script>
  • .once:只触发一次事件
<div id="box">
    <button @click.once="handleClick">click</button>
</div>
<script>
    var vm = new Vue(
        el : "#box",
        methods : 
            handleClick()
                console.log("hello")//只执行了一次
            
        
    )
</script>
  • .passive

    每次事件产生,浏览器都会云查询一下是否有preventDefault阻止该事件的默认行为,如果加上passive修饰符,程序会告诉浏览器,不用查询了,这里没有使用preventDefault阻止默认行为。

<a href="http://www.baidu.com" @click.passive="handleClick">百度</a>
<script>
    var vm = new Vue(
        el:"#app",
        data:,
        methods:
            handleClick(eve)
                // 事件中使用了 .passive ,就会跳过对preventDefault的查询,提高程序性能,此时的preventDefault操作是无效的
                eve.preventDefault();
                console.log("阻止了");
            
        
    );
</script>

一般用于页面的滚动监听等高频触发事件,如@scroll,@touchmove等事件,因为滚动监听的过程中,移动每一个像素都会触发一次事件,每次使用内核线程查询preventDefault会导致滑动卡顿,通过passive修饰会使得内核线程跳过查询,可以大大提升滑动的流畅度

  • 键盘按键修饰符:用于键盘事件

    • .enter表示键盘按下了enter键
    <div id="box">
        <input type="text" @keydown.enter="keyBoardEven">
    </div>
    <script>
        var vm = new Vue(
            el:"#box",
            data:,
            methods:
                keyBoardEven()
                    console.log("按下了回车")
                
            
        )
    </script>
    
    • @keydown.enter.ctrl:表示组合键的触发
    <div id="box">
        <input type="text" @keydown.enter.ctrl="keyBoardEven">
    </div>
    <script>
        var vm = new Vue(
            el:"#box",
            data:,
            methods:
                keyBoardEven()
                    console.log("触发了")
                
            
        )
    </script>
    
    • @keydown.65:按下了A键
    <input type="text" @keydown.65="keyBoardEven">
    

以上是关于04-vue的事件处理器的主要内容,如果未能解决你的问题,请参考以下文章

04-vue的事件处理器

04-Vue入门系列之Vue事件处理

04Vue 之 事件处理

UWP - 父控件拦截指针事件(其中子控件为 ScrollViewer)

iOS实现ScrollView中子控件view的触摸事件响应

样式化组件中子组件输入焦点的样式父组件