vue中的事件監聽機制


事件監聽

基礎用法

  • 監聽dom事件使用v-on指令: v-on:事件類型="一個函數" 。這個事件類型可以自定義。

  • v-on 指令綁定事件后,就會監聽相應的事件,並在觸發時運行一些 JavaScript 代碼。

  


    <div id="box1">
      <button v-on:click="counter += 1">點我</button>
      <p>已點擊 {{ counter }} 次</p>
    </div>
    <script>
        var practice1 = new Vue({
          el: '#box1',
          data: {
            counter: 0
          }
        })  
    </script>

 

展示效果

img

縮寫

v- 前綴作為一種視覺提示,用來識別模板中 Vue 特定的特性。當你在使用 Vue.js 為現有標簽添加動態行為 (dynamic behavior) 時,v- 前綴很有幫助,然而,對於一些頻繁用到的指令來說,就會感到使用繁瑣。同時,在構建由 Vue 管理所有模板的單頁面應用程序 (SPA - single page application) 時,v- 前綴也變得沒那么重要了。因此,Vue 為 v-on 提供了特定簡寫:

 <!-- 完整語法 -->
 <a v-on:click="doSomething">click</a>

 <!-- 縮寫 -->
 <a @click="doSomething">click</a>
 
  • @clickv-on:click 的簡寫形式, @ 即表示 v-on:
  • 它們看起來可能與普通的 HTML 略有不同,但 : 與 @ 對於特性名來說都是合法字符,在所有支持 Vue 的瀏覽器都能被正確地解析。而且,它們不會出現在最終渲染的標記中。縮寫語法是完全可選的。

作用

綁定事件監聽,表達式可以是一個方法的名字或一個內聯語句,
如果沒有修飾符也可以省略,用在普通的html元素上時,只能監聽原生DOM 事件。用在自定義元素組件上時,也可以監聽子組件觸發的自定義事件。  

常用事件

  • v-on:click
  • v-on:keydown
  • v-on:keyup
  • v-on:mouseenter
  • v-on:mouseleave
  • v-on:mousedown
  • v-on:mouseover
  • v-on:submit

示例


<!-- v-on:submit 阻止默認行為 -->
<form v-on:submit.prevent></form>


Vue.js 提供了一個 $event 變量,使用它可以訪問原生 DOM 事件。$event 變量可以通過方法傳入。

<div id="app">
    <!-- 內聯語句 -->
    <a href="www.163.com" v-on:click="openUrl('被禁用嘍',$event)">被禁用嘍</a>
</div>    

<script>
    var app = new Vue({
        el:"#box",
        data: {
            count:0
        },
        methods: {
            openUrl:function (param,event) {
                event.preventDefault();
                console.log("param"+ param);
            }
        }
    })
</script>

輸出結果:

param:被禁用咯

這個示例利用傳入的 event 參數,禁用了原有的鏈接跳轉邏輯。

事件修飾符

.stop


<!-- v-on:click.stop 阻止事件冒泡 -->
<button v-on:click.stop="show">B</button>

.prevent

<!-- v-on:click.prevent 阻止默認行為 -->

<a href="http://www.baidu.com/" v-on:click.prevent>A</a> 
<!-- 沒有表達式-->

<a href="http://www.baidu.com/" v-on:click.prevent="show">B</a>
<!-- 有表達式 -->

<!-- 舉例 -->
<div id="app">
        <a href="http://www.baidu.com/" v-on:click.prevent>A</a>
        <br />
        <a href="http://www.baidu.com/" v-on:click.prevent="show">B</a>
    </div>

</div>
<script type="text/javascript">
    var vm = new Vue({
        el:'#app',
        methods:{
            show(){
                console.log("1")
            }
        }
    })
</script>

A鏈接的默認事件是跳轉到baidu.com,添加了prevent后,點擊A,默認事件無效。

B鏈接的默認事件也是跳轉到baidu.com,添加了帶有表達式的prevent后,點擊B,跳轉事件無效,但手動添加的show方法有效,
控制台中顯示1,因為show不是默認事件。

.capture

<!-- 添加事件偵聽器時使用事件捕獲模式 -->
<div v-on:click.capture="doThis">text</div>

.self

<!-- v-on:click.self  -->
<div v-on:click.self="show2"></div>

功能:當事件是從偵聽器綁定的元素本身觸發時才觸發回調。

舉例:

<div id="app">
    <div style="width: 100px;height: 100px;background-color: #008000;" v-on:click="show1">
        第一層
        <div v-on:click.self="show2">
            第二層
            <div v-on:click="show3">
                第三層
                <div v-on:click="show4">
                    第四層
                </div>
            </div>
        </div>
    </div>
</div>
<script type="text/javascript">
    var vm = new Vue({
        el: '#app',
        methods: {
            show1() {console.log("1")},
            show2() {console.log("2")},
            show3() {console.log("3")},
            show4() {console.log("4")}
        }
    })
</script>

假設我們沒有在第二層的div上添加self,那么我們點擊第四層的時候,控制台將會出現結果4 3 2 1(冒泡),
添加了之后,點擊第四層,控制台顯示4 3 1,因為第二層的self把第二層的事件設置成了僅自己調用時才有效,
所以冒泡把第二層跳過了。

.keyCode | keyAlias


<!-- .{keyCode | keyAlias} 用特定按鍵觸發事件 -->
<input type="text"  v-on:keydown.13="show1" /><br/>
<!-- 使用KeyCode 13代表enter鍵 -->

<input type="text"  v-on:keydown.right="show2" />
<!-- 使用別名,right代表方向鍵右 -->

.native

功能:監聽組件根元素的原生事件。

<div id="app">
    <mycomponent v-on:click.native="myfn"></mycomponent>
</div>
<script type="text/javascript">
    Vue.component('mycomponent',{
        template:`<a href="#">點我</a>`
    })
    var vm = new Vue({
                el: '#app',
        methods:{
            myfn(){
                console.log(1);
            }
        }
    });
</script>
  • 使用native修飾符需要先創建一個自定義組件,然后在html中調用組件時,再使用。
  • 如果v-on:click不加.native,那么點擊是無效的,控制台不會出現任何內容。

.once

功能:只觸發一次回調。多次點擊,控制台只出現一次結果。
<mycomponent v-on:click.native.once="myfn"></mycomponent>

  • 使用修飾符時,順序很重要;相應的代碼會以同樣的順序產生。因此,用 @click.prevent.self 會阻止所有的點擊,而 @click.self.prevent 只會阻止元素上的點擊。

動態參數

2.6.0 新增

從 2.6.0 開始,可以用方括號括起來的 JavaScript 表達式作為一個指令的參數:

<a v-on:[eventName]="doSomething"> ... </a>

在這個示例中,當 eventName 的值為 "focus" 時,v-on:[eventName] 將等價於 v-on:focus


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM