Vue Event

事件監(jiān)聽

v-on事件監(jiān)聽DOM事件,并在觸發(fā)時運行JS代碼稼跳。

例如:計數(shù)器增減

<input type="text" v-model="counter" />
<button v-on:click="counter += 1">+</button>
<button v-on:click="counter -= 1">-</button>
var vm = new Vue({
  el:'#app',
  data:{counter:0}
});

完整代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet"  />
</head>
<body>
    <div id="app" class="container">
        <h1 class="page-header">VUE</h1>
        <div class="input-group">
            <span class="input-group-btn">
                <button class="btn btn-default" v-on:click="counter -= 1">-</button>
            </span>
            <input type="text" class="form-control" v-model="counter" value="">
            <span class="input-group-btn">
                <button class="btn btn-default" v-on:click="counter += 1">+</button>
            </span>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                counter:0
            }
        });
    </script>
</body>
</html>

事件處理方法

v-on可接受一個需調(diào)用的方法名稱

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet"  />
</head>
<body>
    <div id="app" class="container">
        <h1 class="page-header">VUE</h1>
        <div class="input-group">
            <input type="text" class="form-control" v-model="message"/>
            <span class="input-group-btn">
                <button class="btn btn-default" v-on:click="todo">todo</button>
            </span>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                message:''
            },
            methods:{
                todo:function(evt){
                    if(evt){
                        console.log(this.message, evt.target.tagName);
                        this.message = evt.target.tagName;
                    }
                }
            }
        });
    </script>
</body>
</html>

內(nèi)聯(lián)處理器中的方法

可在內(nèi)聯(lián)JS語句中調(diào)用方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet"  />
</head>
<body>
    <div id="app" class="container">
        <h1 class="page-header">VUE</h1>
        <div class="input-group">
            <input type="text" class="form-control" v-model="message"/>
            <span class="input-group-btn">
                <button class="btn btn-default" v-on:click="todo('hello')">todo</button>
            </span>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                message:''
            },
            methods:{
                todo:function(msg){
                    if(msg){
                        this.message = msg;
                    }
                }
            }
        });
    </script>
</body>
</html>

若需在內(nèi)聯(lián)語句處理器中訪問原始的DOM事件献幔,可用特殊變量$event將其傳入方法。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet"  />
</head>
<body>
    <div id="app" class="container">
        <h1 class="page-header">VUE</h1>
        <div class="input-group">
            <input type="text" class="form-control" v-model="message"/>
            <span class="input-group-btn">
                <button class="btn btn-default" v-on:click="todo('hello',$event)">todo</button>
            </span>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <script>
        var vm = new Vue({
            el:'#app',
            data:{
                message:''
            },
            methods:{
                todo:function(msg,evt){
                    if(evt){
                        evt.preventDefault();//訪問原生事件對象
                    }
                    this.message = msg;
                }
            }
        });
    </script>
</body>
</html>

事件修飾符

在事件處理程序中調(diào)用 event.preventDefault()event.stopPropagation() 是非常常用的需求。盡管可在方法中輕松實現(xiàn)涝影,更好的方式是:方法只是純粹的數(shù)據(jù)邏輯,而不是去處理DOM事件細(xì)節(jié)争占。

為解決此問題燃逻,v-on提供了事件修飾符,修飾符是由點開頭的指令后綴來表示臂痕。

  • .stop 阻止事件繼續(xù)傳播
  • .prevent 不再重載頁面
  • .capture 使用時間捕獲模式
  • .self 當(dāng)前元素自身時觸發(fā)
  • .once
<a v-on:click.stop="doStop">阻止單擊事件繼續(xù)傳播</a>

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

<a v-on:click.stop.prevent="doThis">修飾符可串聯(lián)</a>

<form v-on:submit.prevent>僅有修飾符</form>

<div v-on:click.capture="doCapture">
添加事件監(jiān)聽器時使用時間捕獲模式伯襟,即元素自身觸發(fā)的事件先在此處出處理,然后才交由內(nèi)部元素進(jìn)行處理握童。
</div>

<div v-on:click.self="doThat">
僅當(dāng)event.target是當(dāng)前元素自身時觸發(fā)處理函數(shù)姆怪,即事件不是從內(nèi)部元素觸發(fā)的。
</div>

使用修飾符時澡绩,順序很重要稽揭。相應(yīng)的代碼會以同樣的順序產(chǎn)生,因此用@click.prevent.self會阻止所有點擊肥卡,而@click.self.prevent只會阻止對元素自身的點擊溪掀。

<a v-on:click.once="doThis">點擊事件將只會觸發(fā)一次</a>

不想其它只能對原生的DOM事件起作用的修飾符,.once修復(fù)符還能被用到自定義的組件事件上步鉴。

<div v-on:scroll.passive="onScroll">...</div>

Vue為修飾符額外提供了.passive修飾符來提升移動端的性能揪胃。例如在滾動時瀏覽器會在整個事件處理完畢后再觸發(fā)滾動,因為瀏覽器并不知道這個事件是否在其他處理函數(shù)中被調(diào)用了event.preventDefault()唠叛。.passive修飾符用來進(jìn)一步告訴瀏覽器此事件的默認(rèn)行為不會被取消只嚣。

不要把.passive.prevent一起使用,被動處理函數(shù)無法阻止默認(rèn)的事件行為艺沼。

按鍵修飾符

在監(jiān)聽鍵盤事件時册舞,需檢查常見的鍵值。Vue允許為v-on在監(jiān)聽鍵盤時添加按鍵修飾符:

# 當(dāng)keyCode為13是調(diào)用vm.submit()
<input v-on:keyup.13="submit" />
# 別名
<input v-on:keyup.enter="submit" />
# 縮寫語法
<input @keyup.enter="submit" />

按鍵別名

  • .enter
  • .tab
  • .delete
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

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

Vue.config.keyCodes.f1 = 112

可將keyboardEvent.key暴露的任意有效按鍵名轉(zhuǎn)換為kebab-case來作為修飾符:

# 當(dāng) `$event.key==='PageDown'`時被調(diào)用
<input @keyup.page-down="onPageDown">

系統(tǒng)修飾符

系統(tǒng)修飾符來實現(xiàn)僅在按下相應(yīng)按鍵時才出發(fā)鼠標(biāo)或鍵盤事件的監(jiān)聽器

  • .ctrl
  • .alt
  • .shift
  • .meta
# Alt + C
<input @keyup.alt.67="clear">

# Ctrl + Click
<div @click.ctrl="todo">do something</div>

修飾鍵與常規(guī)按鍵不同障般,在和keyup事件一起使用時调鲸,事件觸發(fā)時修飾鍵必須處于按下狀態(tài)。即只有在按住Ctrl的情況下釋放其它按鍵挽荡,才能觸發(fā)keyup.ctrl藐石,而淡淡釋放ctrl也不會觸發(fā)事件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末定拟,一起剝皮案震驚了整個濱河市于微,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖株依,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驱证,死亡現(xiàn)場離奇詭異,居然都是意外死亡恋腕,警方通過查閱死者的電腦和手機(jī)抹锄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠藤,“玉大人伙单,你說我怎么就攤上這事」ぃ” “怎么了吻育?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淤井。 經(jīng)常有香客問我扫沼,道長,這世上最難降的妖魔是什么庄吼? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任缎除,我火速辦了婚禮,結(jié)果婚禮上总寻,老公的妹妹穿的比我還像新娘器罐。我一直安慰自己,他們只是感情好渐行,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布轰坊。 她就那樣靜靜地躺著,像睡著了一般祟印。 火紅的嫁衣襯著肌膚如雪肴沫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天蕴忆,我揣著相機(jī)與錄音颤芬,去河邊找鬼。 笑死套鹅,一個胖子當(dāng)著我的面吹牛站蝠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卓鹿,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼菱魔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吟孙?” 一聲冷哼從身側(cè)響起澜倦,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤聚蝶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后藻治,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體既荚,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年栋艳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片句各。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡吸占,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凿宾,到底是詐尸還是另有隱情矾屯,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布初厚,位于F島的核電站件蚕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏产禾。R本人自食惡果不足惜排作,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亚情。 院中可真熱鬧妄痪,春花似錦、人聲如沸楞件。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽土浸。三九已至罪针,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黄伊,已是汗流浹背泪酱。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留还最,地道東北人西篓。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像憋活,于是被迫代替她去往敵國和親岂津。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359