VUE復習筆記9(事件處理)

監(jiān)聽事件

可以使用 v-on 指令監(jiān)聽DOM事件溯泣,并在觸發(fā)的時候運行一些js代碼鹏往。

<div id="example-1">
  <button v-on:click="counter += 1">Add 1</button>
  <p>The button above has been clicked {{ counter }} times.</p>
</div>

var example1 = new Vue({
  el: '#example-1',
  data: {
    counter: 0
  }
})

事件處理方法

以上是把js代碼直接寫在 v-on中了蓖租,但是實際中纪挎,js的 邏輯代碼會比較復雜,所以一般在 v-on中直接接收方法名梳星。

<div id="example-2">
  <!-- `greet` 是在下面定義的方法名 -->
  <button v-on:click="greet">Greet</button>
</div>

var example2 = new Vue({
  el: '#example-2',
  data: {
    name: 'Vue.js'
  },
  // 在 `methods` 對象中定義方法
  methods: {
    greet: function (event) {
      // `this` 在方法里指向當前 Vue 實例
      alert('Hello ' + this.name + '!')
      // `event` 是原生 DOM 事件
      if (event) {
        alert(event.target.tagName)
      }
    }
  }
})

// 也可以用 JavaScript 直接調用方法
example2.greet() // => 'Hello Vue.js!'

內聯處理器中的方法

<div id="example-3">
  <button v-on:click="say('hi')">Say hi</button>
  <button v-on:click="say('what')">Say what</button>
</div>

new Vue({
  el: '#example-3',
  methods: {
    say: function (message) {
      alert(message)
    }
  }
})

我們有時候需要在內聯的js語句中訪問原生的dom事件赞赖,可以用特殊變量$event傳入方法。

<button v-on:click="warn('Form cannot be submitted yet.', $event)">
  Submit
</button>

事件修飾符

在事件處理程序中冤灾,event.preventDefault()event.stopPropagation()是非常常見的需求前域。盡管我們可以在方法中輕松實現這點,但更好的方式是:方法只有純粹的數據邏輯韵吨,而不是去處理 DOM 事件細節(jié)匿垄。

1.event.stopPropagation()方法

這是阻止事件的冒泡方法,不讓事件向documen上蔓延归粉,但是默認事件任然會執(zhí)行椿疗,當你掉用這個方法的時候,如果點擊一個連接糠悼,這個連接仍然會被打開届榄,

2.event.preventDefault()方法

這是阻止默認事件的方法,調用此方法是倔喂,連接不會被打開铝条,但是會發(fā)生冒泡靖苇,冒泡會傳遞到上一層的父元素;

3.return false 班缰;

這個方法比較暴力贤壁,他會同事阻止事件冒泡也會阻止默認事件;寫上此代碼埠忘,連接不會被打開脾拆,事件也不會傳遞到上一層的父元素;可以理解為return false就等于同時調用了event.stopPropagation()和event.preventDefault()

vue中提供了事件修飾符來解決這些問題莹妒。事件修飾符是由 . 開始指令后綴來描述的名船。

.stop
.prevent
.capture
.self
.once
.passive

<!-- 阻止單擊事件繼續(xù)傳播 -->
<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重載頁面 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 修飾符可以串聯,就是可以同時使用多個修飾符 -->
<a v-on:click.stop.prevent="doThat"></a>

<!-- 添加事件監(jiān)聽器時使用事件捕獲模式 -->
<!-- 即元素自身觸發(fā)的事件先在此處理动羽,然后才交由內部元素進行處理 -->
<div v-on:click.capture="doThis">...</div>

<!-- 只當在 event.target 是當前元素自身時觸發(fā)處理函數 -->
<!-- 即事件不是從內部元素觸發(fā)的 -->
也就是說點擊 div中的內容是無效的包帚,只有點擊當前div才觸發(fā)
<div v-on:click.self="doThat">...</div>

<!-- 點擊事件將只會觸發(fā)一次 -->
<a v-on:click.once="doThis"></a>
不像其它只能對原生的 DOM 事件起作用的修飾符渔期,`.once` 修飾符還能被用到自定義的[組件事件](https://cn.vuejs.org/v2/guide/components-custom-events.html)上运吓。

<!-- 滾動事件的默認行為 (即滾動行為) 將會立即觸發(fā) -->
<!-- 而不會等待 `onScroll` 完成  -->
<!-- 這其中包含 `event.preventDefault()` 的情況 -->
<div v-on:scroll.passive="onScroll">...</div>
這個 .passive 修飾符尤其能夠提升移動端的性能。

使用修飾符時疯趟,順序很重要拘哨;相應的代碼會以同樣的順序產生。因此信峻,用 v-on:click.prevent.self 會阻止所有的點擊倦青,而 v-on:click.self.prevent只會阻止對元素自身的點擊。

不要把 .passive 和 .prevent 一起使用盹舞,因為 .prevent 將會被忽略产镐,同時瀏覽器可能會向你展示一個警告。請記住踢步,.passive 會告訴瀏覽器你不想阻止事件的默認行為癣亚。

按鍵修飾符

在監(jiān)聽鍵盤事件時,我們經常需要檢查常見的按鍵值获印,Vue 允許為 v-on 在監(jiān)聽鍵盤事件時添加按鍵修飾符:

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

因為按鍵的數量很多述雾,記住多有的keycode比困難,所以vue為常見的按鍵提供了別名兼丰。

<!-- 同上 -->
<input v-on:keyup.enter="submit">

<!-- 縮寫語法 -->
<input @keyup.enter="submit">

全部的按鍵別名:

.enter
.tab
.delete (捕獲“刪除”和“退格”鍵)
.esc
.space
.up
.down
.left
.right

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

// 可以使用 v-on:keyup.f1

Vue.config.keyCodes.f1 = 112

系統(tǒng)修飾鍵

可以用如下修飾符來實現僅在按下相應按鍵時才觸發(fā)鼠標或鍵盤事件的監(jiān)聽器玻孟。

.ctrl
.alt
.shift
.meta

注意:在 Mac 系統(tǒng)鍵盤上,meta 對應 command 鍵 (?)鳍征。在 Windows 系統(tǒng)鍵盤 meta 對應 Windows 徽標鍵 (?)黍翎。在 Sun 操作系統(tǒng)鍵盤上,meta 對應實心寶石鍵 (◆)艳丛。在其他特定鍵盤上玩敏,尤其在 MIT 和 Lisp 機器的鍵盤斗忌、以及其后繼產品,比如 Knight 鍵盤旺聚、space-cadet 鍵盤织阳,meta 被標記為“META”。在 Symbolics 鍵盤上砰粹,meta 被標記為“META”或者“Meta”唧躲。

組合鍵demo
<!-- Alt + C -->
<input @keyup.alt.67="clear">

<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

請注意修飾鍵與常規(guī)按鍵不同,在和 keyup 事件一起用時碱璃,事件觸發(fā)時修飾鍵必須處于按下狀態(tài)弄痹。換句話說,只有在按住 ctrl 的情況下釋放其它按鍵嵌器,才能觸發(fā) keyup.ctrl肛真。而單單釋放 ctrl 也不會觸發(fā)事件。如果你想要這樣的行為爽航,請為 ctrl 換用 keyCode:keyup.17蚓让。

同時這種事件只能在表單上運作。

鼠標按鈕修飾符

.left
.right
.middle

<p @click.right="handleClick()">test</p>

這些修飾符會限制處理函數僅響應特定的鼠標按鈕讥珍。

為什么在HTML中監(jiān)聽事件

你可能注意到這種事件監(jiān)聽的方式違背了關注點分離 (separation of concern) 這個長期以來的優(yōu)良傳統(tǒng)历极。但不必擔心,因為所有的 Vue.js 事件處理方法和表達式都嚴格綁定在當前視圖的 ViewModel 上衷佃,它不會導致任何維護上的困難趟卸。

1.掃一眼 HTML 模板便能輕松定位在 JavaScript 代碼里對應的方法。

2.因為你無須在 JavaScript 里手動綁定事件氏义,你的 ViewModel 代碼可以是非常純粹的邏輯锄列,和 DOM 完全解耦,更易于測試惯悠。

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

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末饶囚,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子鸠补,更是在濱河造成了極大的恐慌萝风,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紫岩,死亡現場離奇詭異规惰,居然都是意外死亡,警方通過查閱死者的電腦和手機泉蝌,發(fā)現死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門歇万,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揩晴,“玉大人,你說我怎么就攤上這事贪磺×蚶迹” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵寒锚,是天一觀的道長劫映。 經常有香客問我,道長刹前,這世上最難降的妖魔是什么泳赋? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮喇喉,結果婚禮上祖今,老公的妹妹穿的比我還像新娘。我一直安慰自己拣技,他們只是感情好千诬,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著过咬,像睡著了一般大渤。 火紅的嫁衣襯著肌膚如雪制妄。 梳的紋絲不亂的頭發(fā)上掸绞,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機與錄音耕捞,去河邊找鬼衔掸。 笑死,一個胖子當著我的面吹牛俺抽,可吹牛的內容都是我干的敞映。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼磷斧,長吁一口氣:“原來是場噩夢啊……” “哼振愿!你這毒婦竟也來了?” 一聲冷哼從身側響起弛饭,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤冕末,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侣颂,有當地人在樹林里發(fā)現了一具尸體档桃,經...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年憔晒,在試婚紗的時候發(fā)現自己被綠了藻肄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔑舞。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘹屯,靈堂內的尸體忽然破棺而出攻询,到底是詐尸還是另有隱情,我是刑警寧澤州弟,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布蜕窿,位于F島的核電站,受9級特大地震影響呆馁,放射性物質發(fā)生泄漏桐经。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一浙滤、第九天 我趴在偏房一處隱蔽的房頂上張望阴挣。 院中可真熱鬧,春花似錦纺腊、人聲如沸畔咧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誓沸。三九已至,卻和暖如春壹粟,著一層夾襖步出監(jiān)牢的瞬間拜隧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工趁仙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洪添,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓雀费,卻偏偏與公主長得像干奢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盏袄,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內容

  • ??JavaScript 與 HTML 之間的交互是通過事件實現的辕羽。 ??事件逛尚,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,477評論 1 11
  • 1.事件處理: 這個param可以是javascript代碼,可以是方法名逛漫,可以是調用js方法(可傳值)黑低。 1)監(jiān)...
    廖馬兒閱讀 1,914評論 0 0
  • 本節(jié)介紹各種常見的瀏覽器事件。 鼠標事件 鼠標事件指與鼠標相關的事件,主要有以下一些克握。 click 事件蕾管,dblc...
    許先生__閱讀 2,424評論 0 4
  • 主要還是自己看的,所有內容來自官方文檔菩暗。 介紹 Vue.js 是什么 Vue (讀音 /vju?/掰曾,類似于 vie...
    Leonzai閱讀 3,334評論 0 25
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內容,還有我對于 Vue 1.0 印象不深的內容停团。關于...
    云之外閱讀 5,046評論 0 29