VUE2 學習筆記3 v-on、事件修飾符、鍵盤事件

事件處理v-on

用于事件交互。

語法:v-on:要綁定的事件=“事件觸發時執行的函數”?(函數這里可以寫括號,也可以不寫,沒有影響)

簡寫:@:

事件觸發時要執行的函數,在Vue配置參數中,通過methods:{}配置

<body><div id="root"><button v-on:click="consoleMessage">1</button><button @click="consoleMessage">2</button></div><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data:{},methods:{consoleMessage(){console.log('hello');}}})</script></body>

傳參、this指向

傳參:事件默認傳遞參數event(也可以不叫這個名字)。如果需要event之外的參數,可以在v-on設置綁定的函數時,以 要綁定的函數名(要傳遞的參數) 格式。和函數傳參是一樣的。

但要注意的是,當自己傳遞了某個參數時,可能無法在綁定的事件里獲取event(取決于當前vue版本的語法)。如果無法獲取event,在傳參時,就要使用$event表示當前位置傳遞event。但如果語法支持,也可以直接使用event獲取。

  <button @click="consoleMessage(100,$event)">2</button><button @click="consoleMessage(100)">2</button>

this指向:事件綁定的函數是普通函數的情況下,函數中的this為Vue實例,本例中也就是vm。

如果是寫在Vue組件里,this指向組件。

事件綁定的函數是箭頭函數的情況下,函數中的this為window。

推薦綁定的函數中使用普通函數,不要用箭頭函數。

<body><div id="root"><button v-on:click="consoleMessage('catcat')">1</button><button @click="consoleMessage">2</button></div>...methods:{consoleMessage(name){console.log(`hello ${name}`);console.log(this);}}...

給methods設定的函數,實際上也會被添加到Vue實例上,但事件函數是沒有數據代理的。

如果把事件函數寫在data中,實際上代碼也是可以生效的,但是data中的數據多了一層數據代理,對于不需要代理的數據,最好還是寫在methods中。

事件修飾符

在綁定事件時,如果希望修改事件的某些默認設置,可以使用事件修飾符。

語法:@事件.事件修飾符

Vue中提供的事件修飾符:

.prevent

設置取消事件的默認行為的執行。

以a標簽為例,a標簽默認打開網頁,可以使用click.prevent達成點擊a標簽不會新開網頁的效果。

        ...<a href="www.baidu.com" @click.prevent="myEvent">goto baidu</a>...methods:{...myEvent(){alert('hello');}}...

.stop

阻止事件冒泡。

比如在一個div里有一個按鈕,當點擊按鈕時,由于按鈕在div內部,點擊事件會同時發生在按鈕和div身上,如果按鈕綁定了click事件,div也綁定了click事件,兩個click事件都會觸發。如果只希望觸發內部按鈕的click事件,不觸發外部div事件,可以使用click.stop。

<body><div id="root"><div class="outerDiv" @click="changeColor"><button class="innerButton" @click="change">click</button></div></div><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data:{},methods:{change(){console.log('change');},changeColor(){console.log('changeColor');}}})</script></body>

點擊button會觸發兩個console。

如果設置click.stop,則只會觸發一個:

如果是多層嵌套結構,有三層div,給內層事件設置.stop:

<body><div id="root"><div class="outerDiv" @click="outer"><div class="midDiv" @click="mid"><button class="innerButton" @click.stop="inner">click</button></div></div></div>...methods:{inner(){console.log('inner');},mid(){console.log('mid');},outer(){console.log('outer');}}})...

對于一個a標簽,如果不希望點擊標簽后頁面跳走,用click.stop是無法阻止頁面跳走的:

雖然.stop可以阻止頁面的冒泡行為,但當在a標簽的click上設置stop時,頁面仍然可以跳走,需要寫click.stop.prevent。事件修飾符可以連寫。

.once

事件只能觸發一次。

設置之后,綁定的事件只有第一次觸發時才生效。再點擊不會生效。(比較好理解這里不寫例子了)

.capture

使用事件捕獲模式。

對于嵌套的div,如果兩個div都綁定了相同的click事件,但每個事件的傳參不一樣。

當點擊一個div時,先進行事件捕獲,事件捕獲由外向內,會先經過outerDiv,再經過innerDiv。捕獲結束后,進行事件冒泡,事件冒泡由內向外,先經過innerDiv,再經過outerDiv。在事件冒泡的階段處理事件。

設置事件捕獲,則事件會在捕獲階段進行處理。

如果想先觸發外層div,click.capture應該放在外層div上。

<body><div id="root"><div class="outter" @click="getData(1)"><div class="inner" @click="getData(2)"></div></div></div></div><style>.outter{background-color: aquamarine;padding: 5px;}.inner{background-color: chocolate;padding: 5px;}</style><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data:{},methods:{getData(data){console.log(data);}}})</script></body>

點擊內部div,返回的順序

給外部div設置捕獲階段觸發,返回的順序:

.self

只有event.target是當前操作的元素時才觸發事件。也就是說,如果代碼存在嵌套結構,事件觸發時(通過冒泡或捕獲觸發),可能事件的觸發并不是由直接對當前標簽進行交互時觸發,是冒泡或捕獲上來的,這種情況下綁定的事件函數不會被觸發。

.passive

事件的默認行為立即執行,無需等待事件回調執行完畢。

這里用一個滾動事件來說明,先回顧一下滾動事件:

overflow:auto。當元素溢出時,出現滾動條。

綁定滾動事件:

@scroll 頁面上的滾動條滑動時觸發,當滾動條到底時,再把滾動條往下拽,事件不會觸發。

@wheel 滾動鼠標的滾輪時觸發,當滑動條到底時,再滾動鼠標滾輪,也會觸發事件。

當執行wheel滾動事件時,會先執行綁定事件內的邏輯,當綁定事件執行完畢后,才執行滾動事件的默認行為(滾動條移動)。因此當滾動事件內部的邏輯運算時間過長時,即使移動滾動條,滾動條也會出現不動的現象。

<body><div id="root"><ul @wheel="getData"><li></li><li></li><li></li></ul></div><style>ul{width: 200px;height: 200px;background-color: aqua;overflow: auto; }  li{width: 200px;height: 100px;}</style><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data:{},methods:{getData(){for(let i = 0;i < 1000000;++i){console.log('con');}}}})</script></body>

在這個例子中,由于滾輪滑動觸發的事件內部要執行100萬次,因此即使滑動滑動條,也很久不會有反應。

可以使用wheel.passive來讓默認行為先觸發,不用等綁定的事件執行完畢后再觸發。

    <div id="root"><ul @wheel.passive="getData"><li></li><li></li><li></li></ul></div>

但并不是所有的事件都在綁定事件執行完成后才執行,大部分事件會先執行默認行為(滾動事件中,scroll就是先執行默認事件,因此scroll不需要設置修飾符,也可以正常執行)。

鍵盤事件

兩個鍵盤事件

keydown 按下鍵盤就觸發,不需要抬起來。

keyup 按下鍵盤再抬起來才觸發。

鍵盤的名稱和編碼、如何設置按下特定按鍵時觸發綁定事件

input框內的數據通過event.target.value獲取。

設置按下特定按鍵時觸發綁定事件:語法是keyup.按鍵別名,表示按對應的按鍵時才觸發綁定事件。通過keyup/keydown.enter代表按下回車抬起時才觸發綁定的事件。

<body><input @keydown.enter="getKeyDown" id="root" v-model:="code"><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data(){return {code : '',}},methods:{getKeyDown(){console.log(`enter ${this.code}`);},}})</script>
</body>

(按center鍵觸發,輸出當前輸入框中的數據)

常見別名: enter 回車;delete 刪除/退格;esc 退出;space 空格;tab 換行;up 上;down 下;left 左;right 右

如果想要給某個按鍵綁定事件,但是這個事件不在vue提供的別名里,可以使用按鍵本身的名字來指定只有按下某個特殊的鍵時,才觸發綁定事件。鍵盤上每個按鍵都有自己的名字和編碼。event.key會返回按鍵的名字。event.keyCode可以獲得鍵盤事件按下的按鍵編碼。

<body><input @keydown="getKeyDown" id="root" v-model="code"><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data(){return {code : '',}},methods:{getKeyDown(){console.log(event.key);console.log(event.keyCode);},}})</script>
</body>

對于駝峰形式的key,不能直接寫key,應該把每個字母都變成小寫,并且用-連接。

以PageDown為例,如果想設置按下PageDown觸發事件:

    <input @keydown.page-down="getKeyDown" id="root" v-model="code">

而且,不是鍵盤上所有的按鍵都可以綁定事件。

在某些瀏覽器上,通過keyup/keydown.按鍵編碼 也可以觸發綁定的事件,但是這種方式現在不被推薦,這種方式在漸漸被移除,在一些瀏覽器上無法生效(對于不同的設備,每個按鍵的編碼不完全一樣,所以這種方法在被移除)。

特殊的按鍵

tab鍵在常見按鍵里比較特殊,tab會把焦點從當前元素上切走。當前事件如果設定了keyup.tap,按鍵按下之后,焦點已經從當前元素上移走了,因此當keyup時,綁定的事件無法觸發(因為對于當前元素來說,當前元素已經不是之前的元素了,自然也沒有keyup事件)。因此tap使用在keydown上。

ctrl、alt、shift、meta(windows標志鍵)鍵也比較特殊。這些按鍵叫做系統修飾鍵。當這些按鍵配合keyup使用時,按下修飾鍵的同時,需要再按下其他鍵,當釋放其他按鍵時,keyup事件才會被觸發。當這些按鍵配合keydown使用時,不需要按下其他按鍵,只按按鍵本身就能觸發事件。

如果想設置鍵盤按下ctrl+y時才觸發,可以使用keyup.系統修飾鍵.另一個按鍵,用keyup.ctrl.y就可以實現這種效果。

vue自定義鍵盤名稱和編碼

Vue.config.keyCodes.自定義別名 = 按鍵編碼

比如Vue.config.keyCodes.myEnter = 13,可以定義一個叫myEnter的按鍵,他在按鍵編碼為13的鍵被按下或抬起時被識別。但這種方法也不太推薦。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90045.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

變換域通訊系統CCSK的matlab仿真

CCSK&#xff08;Cyclic Code Shift Keying&#xff09;通信系統的MATLAB仿真。實現完整的CCSK調制、AWGN信道傳輸和解調過程&#xff0c;并計算了誤碼率&#xff08;BER&#xff09;。 % CCSK通信系統仿真 clear; clc; close all;% 參數設置 L 31; % m序列…

技術演進中的開發沉思-40 MFC系列:多線程協作

今天說說MFC的線程&#xff0c;當年用它實現中間件消息得心應手之時&#xff0c;可以實現一邊實時接收數據&#xff0c;一邊更新界面圖表圖文信息&#xff0c;順滑得讓人想吹聲口哨。 MFC 多線程它像給程序裝上了分身術&#xff0c;讓原本只能 “單任務跑腿” 的代碼&#xff0…

高速公路自動化安全監測主要內容

近年來&#xff0c;隨著社會經濟的快速發展&#xff0c;高速公路的通車里程不斷增加&#xff0c;交通流量日益增大。與此同時&#xff0c;高速公路交通事故數量也呈現出一定的增長趨勢。這些事故不僅造成了大量的人員傷亡和財產損失&#xff0c;還嚴重影響了社會的穩定和經濟的…

完美解決 Ubuntu 中自定義啟動器圖標重復的問題(以 MATLAB 為例)

如果你在 Ubuntu 上為 MATLAB、PyCharm、Android Studio 或其他第三方應用創建了自定義啟動器&#xff0c;并把它固定到了左側的 Dock 欄&#xff0c;你很可能遇到過這個令人抓狂的場景&#xff1a; 當你滿心歡喜地點擊固定的圖標啟動程序后&#xff0c;Dock 欄上竟然“憑空”冒…

一文讀懂深度模型優化器,掌握煉丹工具

深度模型優化器是訓練神經網絡的核心工具&#xff0c;其目標是高效地找到損失函數的最小值。從基礎的隨機梯度下降&#xff08;SGD&#xff09;到結合一階動量修正與兩階段更新的Ranger&#xff0c;優化器的發展始終圍繞著加速收斂、提升穩定性、適應參數差異和增強泛化能力四大…

關于虛擬機部署的k8s集群calico組件在開機恢復快照時的問題

在恢復虛擬機開機快照的時候總會出現各種的網絡問題&#xff0c;連接不到自己的443端口&#xff0c;集群狀態異常等等&#xff0c;繞一圈都發現不了問題&#xff0c;其實根本就沒問題。虛擬機環境再現&#xff0c;恢復快照后的k8s環境&#xff0c;nfs莫名宕掉提示此報錯&#x…

從感知到決策:虛擬仿真系統與視覺算法融合下的多路RTSP視頻接入技術探究

1?? 背景概述 隨著國防信息化和智能化進程的不斷加快&#xff0c;虛擬仿真系統 與 智能視覺算法平臺 正逐步成為現代化裝備研發、測試驗證與戰術訓練的重要技術支撐。相比傳統的靜態建模或離線推演&#xff0c;新一代作戰仿真與智能系統更強調 實時性、感知能力與動態交互&a…

Android app如果不適配Android 15會怎么樣

深度思考完成 用時49秒 首先&#xff0c;用戶的問題是&#xff1a;“Android app如果不適配Android 15會怎么樣&#xff1f;”我需要基于搜索結果來回答。 讓我回顧搜索結果&#xff1a; ?1&#xff1a;標題是“Android 15應用適配指南”&#xff0c;內容強調了不適配Androi…

Vue-21-利用Vue3的axios+Python的flask實現前后端交互功能

文章目錄 1 任務需求 2 前端 2.1 模板template 2.2 JS代碼script 2.3 Calculate.vue(子組件) 2.4 App.vue(根組件) 3 后端 3.1 導入模塊 3.2 創建應用實例 3.3 配置CORS 3.4 定義路由 3.5 處理請求 3.6 main.py 4 附錄 4.1 CORS 4.1.1 全局啟用CORS 4.1.2 限制允許的域名(更安…

動態規劃之最長回文子串

題目&#xff1a;最長回文子串 給你一個字符串 s&#xff0c;找到 s 中最長的 回文 子串。 示例 1&#xff1a; 輸入&#xff1a;s “babad” 輸出&#xff1a;“bab” 解釋&#xff1a;“aba” 同樣是符合題意的答案。 示例 2&#xff1a; 輸入&#xff1a;s “cbbd” 輸…

Linux 編程中的錯誤處理機制詳解 —— `errno` 全解析

文章目錄Linux 編程中的錯誤處理機制詳解 —— errno 全解析一、什么是 errno&#xff1f;?為什么需要 errno&#xff1f;? 它在哪里定義&#xff1f;二、errno 的設置與讀取規則?? errno 不是總是有效&#xff01;?使用 errno 的正確步驟&#xff1a;三、與 errno 配套使…

力扣-最長遞增子序列

簡單記錄學習~給你一個整數數組 nums &#xff0c;找到其中最長嚴格遞增子序列的長度。子序列 是由數組派生而來的序列&#xff0c;刪除&#xff08;或不刪除&#xff09;數組中的元素而不改變其余元素的順序。例如&#xff0c;[3,6,2,7] 是數組 [0,3,1,6,2,2,7] 的子序列。示例…

公司內部網址怎么在外網打開?如何讓外網訪問內網的網站呢?

很多公司內部本地會部署有中小型的服務器&#xff0c;可以很好的方便用于一些辦公業務系統&#xff0c;或測試開發需要。在數字化辦公和生活場景中&#xff0c;除了公司內部局域網內訪問公司系統外&#xff0c;經常會遇到需要讓外網訪問內網網站的情況。比如企業員工遠程辦公時…

有趣的css - 多選立體標簽按鈕

&#x1f36d; 大家好&#xff0c;我是 Just&#xff0c;這里是「設計師工作日常」&#xff0c;今天分享的是一個交互較完整的多選立體標簽按鈕。 最新文章通過公眾號「設計師工作日常」發布。 目錄整體效果核心代碼html 代碼css 部分代碼完整代碼如下html 頁面css 樣式頁面渲…

C++中byte*和char*的區別

在C中&#xff0c;byte*&#xff08;通常指 std::byte*&#xff09;和 char* 都是指針類型&#xff0c;但它們在語義和用途上有重要區別&#xff1a;1. 類型定義char* char 是C內置的基本類型&#xff0c;表示字符&#xff08;通常是1字節&#xff09;。 char* 常用于&#xff…

【node】npm包本地開發與調試

npm link 進入本地的 babel-plugin-function-try-catch 這個 npm 包的根目錄執行&#xff1a; npm link上面的命令可以將當前的這個包安裝在全局&#xff08;mac 中的路徑是 /usr/local/bin&#xff09;&#xff0c;也就是 npm i -g 安裝包的目錄。 執行后結果如圖&#xff…

突破量子仿真瓶頸:微算法科技MLGO量子算法的算術化與核操作迭代模型

近年來&#xff0c;量子計算機的迅速發展和潛在的強大計算能力吸引了全球科研機構和企業的廣泛關注。量子計算機利用量子力學的特性來處理復雜的計算任務&#xff0c;具有在某些方面遠超經典計算機的潛力。然而&#xff0c;真正實用的量子計算機尚未大規模普及&#xff0c;因此…

python中讀取 Excel 表格數據

在pandas中讀取 Excel 表格后&#xff0c;有多種方式可以按列、按行提取數據&#xff0c;下面我將詳細介紹常見的方法。 0.聲明 在本文中我使用的excel表內容如下&#xff1a;1. 讀取 Excel 文件 首先&#xff0c;我們需要使用 pandas 的 read_excel 函數讀取 Excel 文件&#…

算法訓練營day28 貪心算法②122.買賣股票的最佳時機II、55. 跳躍游戲、 45.跳躍游戲II 、1005.K次取反后最大化的數組和

貪心算法第二篇博客&#xff01;感覺這篇博客中的算法都很巧妙&#xff0c;需要動動腦筋 122.買賣股票的最佳時機II &#xff08;這道題可以遍歷數組&#xff0c;如果不能遍歷的話&#xff0c;就不能做了&#xff0c;需要注意的是&#xff1a; 只有一只股票&#xff01;當前只…

NumPy核心操作全攻略

NumPy&#xff08;Numerical Python&#xff09;是 Python 生態中用于科學計算的核心庫&#xff0c;提供高性能的多維數組對象&#xff08;ndarray&#xff09;及相關的數學運算工具。其核心功能圍繞數組操作、線性代數、隨機數生成等&#xff0c;是數據科學、機器學習等領域的…