最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue中可以綁定多個(gè)事件嗎

 更新時(shí)間:2022年10月13日 10:27:04   作者:燕穗子博客  
這篇文章主要介紹了vue中可以綁定多個(gè)事件嗎,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue可以綁定多個(gè)事件嗎

標(biāo)簽綁定一個(gè)事件處理函數(shù),然后在相應(yīng)的事件處理函數(shù)中調(diào)用想要觸發(fā)的多個(gè)處理函數(shù)

以下兩種方案,都可以實(shí)施

第一種

<button id="test" @click="test1">按鈕</button>
new Vue({
? ? el:"#test",
? ? data:"",
? ? methods:{
? ? ? ? test1:function(){
? ? ? ? ? ? alert("test1");
? ? ? ? ? ? this.test2();
? ? ? ? ? ? this.test3();
? ? ? ? },
? ? ? ? test2:function(){
? ? ? ? ? ? alert("test2");
? ? ? ? },
? ? ? ? test3:function(){
? ? ? ? ? ? alert("test3");
? ? ? ? }
? ? }
})

第二種

綁定多個(gè)事件時(shí),事件之間使用分號(hào)“;”分開(kāi)即可

<el-button type="primary" size="small" @click="add1();add2();">123</el-button>

去methods中添加事件的函數(shù)

methods:{
? ? add1(){
? ? ? ? console.log(123)
? ? },
? ? add2(){
? ? ? ? console.log(456)
? ? },
? ? }

vue事件綁定的原理

之前我搜這個(gè)原理的時(shí)候,好多文章,都只寫(xiě)了兩句話:

  • 原生事件綁定是通過(guò)addEventListener綁定給真實(shí)元素的。
  • 組件事件綁定是通過(guò)Vue自定義的key$on實(shí)現(xiàn)的。

那具體是怎么實(shí)現(xiàn)的呢, 沒(méi)有說(shuō)?

就現(xiàn)在具體看一下。

// 原生事件綁定
<div @click="fn()"></div>
// 組件綁定
<my-component @click.native="fn" @click="fn1"></my- component>

原理:

事件的編譯:

let compiler = require('vue-template-compiler'); //vue-loader
let r1 = compiler.compile('<div @click="fn()"></div>'); 
let r2 = compiler.compile('<my-component @click.native="fn" @click="fn1"></my- component>'); console.log(r1); 
// {on:{click}} console.log(r2); 
// {nativeOn:{click},on:{click}}

兩者編譯出來(lái)不一樣

// 前者
with (this){return _c('div',{on:{"click":function($event){return fn()}}})}
// 后者
with (this){return _c('my-component',{on:{"click":fn1},nativeOn:{"click":function($event){return fn($event)}}})}

在這里插入圖片描述

1.1 原生 dom 的綁定

  • Vue 在創(chuàng)建真是 dom 時(shí)會(huì)調(diào)用 createElm ,默認(rèn)會(huì)調(diào)用 invokeCreateHooks
  • 會(huì)遍歷當(dāng)前平臺(tái)下相對(duì)的屬性處理代碼,其中就有 updateDOMListeners 方法,內(nèi)部會(huì)傳入 add 方法

源碼:

function updateDOMListeners (oldVnode: VNodeWithData, vnode: VNodeWithData) { 
	if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) { return }
	const on = vnode.data.on || {} const oldOn = oldVnode.data.on || {} 
	target = vnode.elm 
	normalizeEvents(on) 
	updateListeners(on, oldOn, add, remove, createOnceHandler, vnode.context) 
	target = undefined 
}
function add ( 
	name: string, 
	handler: Function, 
	capture: boolean, 
	passive: boolean 
) {
	target.addEventListener( // 給當(dāng)前的dom添加事件 
		name, 
		handler, 
		supportsPassive 
		? {  capture, passive  } 
		: capture 
	) 
}

1.2 組件中綁定事件

export function updateComponentListeners ( 
	vm: Component, 
	listeners: Object, 
	oldListeners: ?Object 
) {
	target = vm updateListeners(
		listeners, oldListeners || {}, 
		add, 
		remove,
		createOnceHandler, vm)
		target = undefined 
}
function add (event, fn) { 
	target.$on(event, fn) 
}

組件綁定事件是通過(guò) vue 中自定義的 $on 方法來(lái)實(shí)現(xiàn)的

1.3 $on 是怎么實(shí)現(xiàn)的

vm.$on( event, callback )

作用:

監(jiān)聽(tīng)當(dāng)前實(shí)例上的自定義事件。事件可以由vm.$emit觸發(fā)?;卣{(diào)函數(shù)會(huì)接收所有傳入事件觸發(fā)函數(shù)的額外參數(shù)。

原理:

$on是采用了經(jīng)典的發(fā)布訂閱者設(shè)計(jì)模式,首先定義一個(gè)事件中心,通過(guò)$on訂閱事件,將事件存儲(chǔ)在事件中心里面,然后通過(guò)$emit觸發(fā)事件中心里面存儲(chǔ)的訂閱事件。

Vue.prototype.$on = function (event, fn) {
    const vm: Component = this
    if (Array.isArray(event)) {
        for (let i = 0, l = event.length; i < l; i++) {
            this.$on(event[i], fn)
        }
    } else {
        (vm._events[event] || (vm._events[event] = [])).push(fn)
    }
    return vm
}

看代碼,邏輯很簡(jiǎn)單,$on函數(shù)接收倆個(gè)參數(shù),第一個(gè)是訂閱的事件名,可以是多個(gè),如果是多個(gè)就傳入一個(gè)事件名數(shù)組。另一個(gè)是回調(diào)函數(shù)。

首先判斷傳入的事件是不是一個(gè)數(shù)組,如果是,那么遍歷這個(gè)數(shù)組,將數(shù)組中的每一個(gè)事件都遞歸調(diào)用$on方法將其作為單個(gè)事件訂閱。

如過(guò)不是數(shù)組,那就當(dāng)做單個(gè)事件名來(lái)處理,以該事件名作為key,先嘗試在當(dāng)前實(shí)例的_events屬性中獲取其對(duì)應(yīng)的事件列表,如果獲取不到就給其賦空數(shù)組為默認(rèn)值,并將第二個(gè)參數(shù)回調(diào)函數(shù)添加進(jìn)去。

多說(shuō)一句,實(shí)例的_events是什么?這就是在事件初始化的時(shí)候,initEvents函數(shù)中綁定了_event屬性并給其賦值為空對(duì)象。這個(gè)_events屬性就是用來(lái)作為當(dāng)前實(shí)例的事件中心,所有綁定在這個(gè)實(shí)例上的事件都會(huì)存儲(chǔ)在事件中心_events屬性中。

這就是$on的內(nèi)部原理。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue結(jié)合Video.js播放m3u8視頻流的方法示例

    Vue結(jié)合Video.js播放m3u8視頻流的方法示例

    本篇文章主要介紹了Vue+Video.js播放m3u8視頻流的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • vue實(shí)現(xiàn)全選、反選功能

    vue實(shí)現(xiàn)全選、反選功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)全選、反選功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Vue實(shí)現(xiàn)Excel本地下載及上傳的方法詳解

    Vue實(shí)現(xiàn)Excel本地下載及上傳的方法詳解

    相信大家在項(xiàng)目中經(jīng)常會(huì)遇到一些上傳下載文件的相關(guān)功能。這篇文章將為大家介紹一下Vue實(shí)現(xiàn)Excel本地下載及上傳的示例代碼,需要的可以參考一下
    2022-07-07
  • element UI 2.15.13與vue2.0表格勾選回顯關(guān)鍵demo

    element UI 2.15.13與vue2.0表格勾選回顯關(guān)鍵demo

    這篇文章主要為大家介紹了element UI 2.15.13與vue2.0表格勾選回顯關(guān)鍵demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 利用vue+turn.js實(shí)現(xiàn)翻書(shū)效果完整實(shí)例

    利用vue+turn.js實(shí)現(xiàn)翻書(shū)效果完整實(shí)例

    這篇文章主要給大家介紹了關(guān)于利用vue+turn.js實(shí)現(xiàn)翻書(shū)效果的相關(guān)資料,turn.js是使用了jquery書(shū)寫(xiě)的,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • vue-cli3項(xiàng)目升級(jí)到vue-cli4 的方法總結(jié)

    vue-cli3項(xiàng)目升級(jí)到vue-cli4 的方法總結(jié)

    這篇文章主要介紹了vue-cli3項(xiàng)目升級(jí)到vue-cli4 的方法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • vue3項(xiàng)目使用pinia狀態(tài)管理器的使用

    vue3項(xiàng)目使用pinia狀態(tài)管理器的使用

    Pinia是一個(gè)專為Vue3設(shè)計(jì)的現(xiàn)代化狀態(tài)管理庫(kù),本文主要介紹了vue3項(xiàng)目使用pinia狀態(tài)管理器的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • vue組件傳值(高級(jí))、屬性傳值、反向傳值、跨級(jí)傳值實(shí)例詳解

    vue組件傳值(高級(jí))、屬性傳值、反向傳值、跨級(jí)傳值實(shí)例詳解

    父組件通過(guò)屬性傳值給子組件,父組件修改數(shù)據(jù)后會(huì)刷新頁(yè)面并重新傳值給子組件,子組件可以修改父組件傳的值并刷新自己的頁(yè)面?但是并不會(huì)修改父組件中的值,這篇文章主要介紹了vue組件傳值(高級(jí))、屬性傳值、反向傳值、跨級(jí)傳值,需要的朋友可以參考下
    2022-09-09
  • Vue實(shí)現(xiàn)一個(gè)返回頂部backToTop組件

    Vue實(shí)現(xiàn)一個(gè)返回頂部backToTop組件

    本篇文章主要介紹了Vue實(shí)現(xiàn)一個(gè)返回頂部backToTop組件,可以實(shí)現(xiàn)回到頂部效果,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • Vue整合AdminLTE模板的方法

    Vue整合AdminLTE模板的方法

    這篇文章主要介紹了Vue整合AdminLTE模板的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05

最新評(píng)論

翁牛特旗| 武义县| 洪江市| 南木林县| 卓尼县| 漯河市| 司法| 叶城县| 肥东县| 安丘市| 宿州市| 会同县| 通州市| 大邑县| 磐安县| 武胜县| 赣州市| 乐陵市| 宣武区| 南丰县| 陇西县| 永兴县| 宜君县| 鄂托克前旗| 西安市| 卫辉市| 布尔津县| 紫云| 鞍山市| 南澳县| 全州县| 邯郸市| 诏安县| 张家界市| 汽车| 天长市| 秭归县| 多伦县| 琼中| 开远市| 沙洋县|