Vue事件處理

来源:http://www.cnblogs.com/xiaohuochai/archive/2017/08/10/7300131.html
-Advertisement-
Play Games

[1]監聽事件 [2]事件修飾符 [3]滑鼠修飾符 [4]鍵值修飾符 [5]修飾鍵 ...


前面的話

  Vue事件監聽的方式貌似違背了關註點分離(separation of concern)的傳統理念。實際上,所有的Vue.js事件處理方法和表達式都嚴格綁定在當前視圖的ViewModel上,它不會導致維護上的困難。使用v-on有以下好處:

  1、掃一眼HTML模板便能輕鬆定位在JS代碼里對應的方法

  2、無須在JS里手動綁定事件,ViewModel代碼可以是非常純粹的邏輯,和DOM完全解耦,更易於測試

  3、當一個ViewModel被銷毀時,所有的事件處理器都會自動被刪除。無須擔心如何自己清理它們

  本文將詳細介紹Vue事件處理

 

事件監聽

  通過v-on指令來綁定事件監聽器

<div id="example">
  <button v-on:click="counter += 1">增加 1</button>
  <p>這個按鈕被點擊了 {{ counter }} 次。</p>
</div>
<script>
var example = new Vue({
  el: '#example',
  data: {
    counter: 0
  }
})
</script>

【方法】

  許多事件處理的邏輯都很複雜,所以直接把JS代碼寫在 v-on 指令中有時並不可行。v-on指令可以接收一個定義的方法來調用

  [註意]不應該使用箭頭函數來定義methods函數,因為箭頭函數綁定了父級作用域的上下文,所以this將不會按照期望指向 Vue 實例

<div id="example">
   <button v-on:click="num">測試按鈕</button>
   <p>{{message}}</p>
</div>
<script>
var example = new Vue({
  el: '#example',
  data:{
    counter:0,
    message:''
  },
  methods: {
    num: function (event) {
      if (event) {
        this.message = event.target.innerHTML + '被按下' + ++this.counter + '';
      }
    }
  }
})
</script>

【內聯語句】

  除了直接綁定到一個方法,也可以用內聯JS語句

<div id="example">
  <button v-on:click="say('hi')">Say hi</button>
  <button v-on:click="say('what')">Say what</button>
   <p>{{message}}</p>
</div>
<script>
var example = new Vue({
  el: '#example',
  data:{
    message:''
  },
  methods: {
    say: function (message) {this.message = message;}
  }
})
</script>

  有時也需要在內聯語句處理器中訪問原生 DOM 事件。可以用特殊變數 $event 把它傳入方法 

<div id="example">
  <button v-on:click="say('hi',$event)">Say hi</button>
  <button v-on:click="say('what',$event)">Say what</button>
   <p>{{message}}</p>
</div>
<script>
var example = new Vue({
  el: '#example',
  data:{
    message:''
  },
  methods: {
    say: function (message,event) {
      if(event){
        event.preventDefault();
      }  
      this.message = message;
    }
  }
})
</script>

 

事件修飾符

  在事件處理程式中調用event.preventDefault()event.stopPropagation()是非常常見的需求。儘管可以在methods中輕鬆實現這點,但更好的方式:methods只有純粹的數據邏輯,而不是去處理 DOM 事件細節

  為瞭解決這個問題, Vue.js 為v-on提供了事件修飾符。通過由點(.)表示的指令尾碼來調用修飾符

.stop 阻止冒泡
.prevent 阻止預設事件
.capture 使用事件捕獲模式
.self 只在當前元素本身觸發
.once 只觸發一次

  下麵是一些例子

<!-- 阻止單擊事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重載頁面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修飾符可以串聯  -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修飾符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件偵聽器時使用事件捕獲模式 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只當事件在該元素本身(比如不是子元素)觸發時觸發回調 -->
<div v-on:click.self="doThat">...</div>
<!-- 點擊事件將只會觸發一次 -->
<a v-on:click.once="doThis"></a>

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

【stop】

  阻止冒泡

<div id="example" @click="setVal1" style="border:1px solid black;width:300px;">
  <button @click="setVal">普通按鈕</button>
  <button @click.stop="setVal">阻止冒泡</button>
  <button @click="reset">還原</button>
  <div>{{result}}</div>
</div>
<script>var example = new Vue({
  el: '#example',
  data:{
    result:''
  },
  methods:{
    setVal(event){
      this.result+=' 子級 ';
    },
    setVal1(){
      this.result+=' 父級 ';
    },
    reset(){
      history.go()
    }
  }
})
</script>

【prevent】

  取消預設事件

<div id="example">
  <a href="http://cnblogs.com" target="_blank">普通鏈接</a>
  <a @click.prevent href="http://cnblogs.com" target="_blank">取消預設行為</a>
</div>
<script>
var example = new Vue({
  el: '#example'
})
</script>

【capture】

  事件捕獲模式

<div id="example" @click.capture="setVal1" style="border:1px solid black;width:300px;">
  <button @click.capture="setVal">事件捕獲</button>
  <button @click="reset">還原</button>
  <div>{{result}}</div>
</div>
<script>var example = new Vue({
  el: '#example',
  data:{
    result:''
  },
  methods:{
    setVal(event){
      this.result+=' 子級 ';
    },
    setVal1(){
      this.result+=' 父級 ';
    },
    reset(){
      history.go()
    }
  }
})
</script>

【self】

<div id="example">
  <div @click="setVal" :style="styleObj1">
    <div :style="styleObj2">普通</div>
    <button @click="reset">還原</button>
  </div>
  <div @click.self="setVal" :style="styleObj1">
    <div :style="styleObj2">self</div>
    <button @click="reset">還原</button>
  </div>  
</div>
<script>
var styleObj1 = {
  display:'inline-block',
  height:'60px',
  width:'120px',
  'background-color': 'lightblue'
};
var styleObj2 = {
  display:'inline-block',
  height:'30px',
  width:'60px',
  'background-color': 'lightgreen'
};
var example = new Vue({
  el: '#example',
  data:{
    styleObj1:styleObj1,
    styleObj2:styleObj2
  },
  methods:{
    setVal(event){
      event.target.style.outline="solid"
    },
    reset(){
      history.go()
    }
  }
})
</script>

【once】

  只觸發一次

<div id="example">
  <button @click="setVal">普通按鈕</button>
  <button @click.once="setVal">觸發一次</button>
  <button @click="reset">還原</button>
  <div>{{result}}</div>
</div>
<script>
var example = new Vue({
  el: '#example',
  data:{
    result:''
  },
  methods:{
    setVal(event){
      this.result+=' 內容 ';
    },
    reset(){
      history.go()
    }
  }
})
</script>

  

滑鼠修飾符

  這些修飾符會限制處理程式監聽特定的滑鼠按鍵

.left 左鍵
.right 右鍵
.middle 滾輪
<div id="example">
  <button @mouseup.right="right" @mouseup.middle="middle" @mouseup.left="left">{{message}}</button>
</div>
<script>
var example = new Vue({
  el: '#example',
  data:{
    message:'分別用左、中、右鍵進行點擊,會出現不同的效果'
  },
  methods:{
    left(){
      this.message = 'left'
    },
    right(){
      this.message = 'right'
    },
    middle(){
      this.message = 'middle'
    },        
  }
})
</script>

 

鍵值修飾符

  在監聽鍵盤事件時,經常需要監測常見的鍵值。 Vue 允許為 v-on 在監聽鍵盤事件時添加關鍵修飾符

<!-- 只有在 keyCode 是 13 時調用 vm.submit() -->
<input v-on:keyup.13="submit">

  記住所有的 keyCode 比較困難,所以 Vue 為最常用的按鍵提供了別名:

.enter 回車
.tab 製表鍵
.delete (捕獲 “刪除” 和 “退格” 鍵)
.esc 返回
.space 空格
.up 上
.down 下
.left 左
.right 右
<div id="example">
  <button @keyup.enter="enter" @keyup.tab="tab" @keyup.delete="delete1" @keyup.esc="esc" @keyup.space="space" @keyup.up="up" @keyup.down="down" @keyup.left="left" @keyup.right="right">{{message}}</button>
</div>
<script>
var example = new Vue({
  el: '#example',
  data:{
    message:'將游標置於按鈕上後,按下鍵盤上不同的按鍵,會有不同的效果'
  },
  methods:{
    enter(){
      this.message = 'enter'
    },
    tab(){
      this.message = 'tab'
    },
    delete1(){
      this.message = 'delete'
    }, 
    esc(){
      this.message = 'esc'
    },
    space(){
      this.message = 'space'
    },
    up(){
      this.message = 'up'
    },
    down(){
      this.message = 'down'
    },
    left(){
      this.message = 'left'
    },
    right(){
      this.message = 'right'
    },                 
  }
})
</script>

  可以通過全局 config.keyCodes 對象自定義鍵值修飾符別名

// 可以使用 v-on:keyup.a
Vue.config.keyCodes.a = 65
<div id="example">
  <button @keyup.a="a"  @keyup.b="b">{{message}}</button>
</div>
<script>
Vue.config.keyCodes.a = 65;
Vue.config.keyCodes.b = 66;
var example = new Vue({
  el: '#example',
  data:{
    message:'按下鍵盤上的a鍵或b鍵'
  },
  methods:{
    a(){
      this.message = 'a'
    },
    b(){
      this.message = 'b'
    },    
  }
})
</script>

 

修飾鍵

  可以用如下修飾符開啟滑鼠或鍵盤事件監聽,使在按鍵按下時發生響應

.ctrl
.alt
.shift
.meta
<!-- Alt + C -->
<input @keyup.alt.67="clear">
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

   下麵一個例子

<div id="example">
  <button @click.ctrl="ctrl"  @click.alt="alt"  @click.shift="shift"  @click.meta="meta">{{message}}</button>
</div>
<script>
var example = new Vue({
  el: '#example',
  data:{
    message:'分別用按住輔助鍵ctrl、alt、shift、meta進行點擊,會出現不同的效果'
  },
  methods:{
    ctrl(){
      this.message = 'ctrl'
    },
    alt(){
      this.message = 'alt'
    },
    shift(){
      this.message = 'shift'
    },  
    meta(){
      this.message = 'meta'
    },           
  }
})
</script>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 鏈接來自:http://blog.csdn.net/u010081689/article/details/50728854 ...
  • 百度版lol百科小樣 ...
  • 0、未完,還有一部分未寫 1、CSS背景 屬性 描述 background 簡寫屬性,作用是將背景屬性設置在一個聲明中。 background-attachment 背景圖像是否固定或者隨著頁面的其餘部分滾動。 background-color 設置元素的背景顏色。 background-image ...
  • 非空驗證 <body> <table> <tr> <td>姓名:</td> <td><input type="text" name="TrueName" id="TrueName" /></td> </tr> ....省略其他input <tr> <td colspan="2"> <input ty ...
  • jsp:<div class="form-group"> <label >交易時間:</label> <input placeholder="開始日期" class="form-control layer-date" id="startDate" name="startDate"> <input p ...
  • 今天學習了PHP數組,整理下相關知識點。 PHP數組是什麼? php數組是一個能在單個變數中存儲多個值的特殊變數。 如:你有一個項目清單(人名清單),將其存儲到單個變數中,如下: 如果這個清單裡面有上百號人名,你要從中找到指定的某一個這樣會有點麻煩了。 解決這個問題的辦法就是創建一個數組。 數組可以 ...
  • 為什麼在input標簽類型為file上傳文件時在標簽中設置屬性 accpet="image/*",打開本地文件夾的速度特別慢? 經過測試發現,在mac裡面safari、Firefox、Chrome(opera不知道為啥老閃退)都沒有卡頓問題 在windows裡面,Firefox不卡頓,只有Chrom ...
  • 前言 首先第一步,先佈局html代碼如下: 上面一看第一個圖片img 就是實現圖片模糊效果的DOM元素,text-gradient實現的是流彩文字效果的DOM元素,border實現的是邊框伸展效果的DOM元素 想一想樣式該咋寫呢,根據這個佈局,我們先來實現圖片模糊效果。 圖片模糊效果 圖片模糊效果要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...