亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue中$on和$emit的實(shí)現(xiàn)原理分析

 更新時(shí)間:2022年05月30日 08:48:27   作者:很懶的哦  
這篇文章主要介紹了Vue中$on和$emit的實(shí)現(xiàn)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Vue中發(fā)布訂閱模式

在Vue中采用了發(fā)布訂閱模式,典型的兄弟組件間的通信$on和$emit

發(fā)布訂閱模式:(訂閱者、發(fā)布者、信號(hào)中心)

一個(gè)發(fā)布者$emit發(fā)布一個(gè)事件到信號(hào)中心 eventBus ,訂閱者們 $on 通過(guò)信號(hào)中心收到該事件,進(jìn)行處理

在這里模擬一個(gè)自定義事件 $on和$emit事件

class EventBus{
	constructor(){
		// 1.處理事件對(duì)應(yīng)的處理函數(shù)
		this.sub = {}
	}
	$on(event,fn){
		if(!this.sub[event]){
			// 2.判斷sub是否已經(jīng)存在該事件了,沒(méi)有的話就賦值一個(gè)數(shù)組,用來(lái)存儲(chǔ)觸發(fā)函數(shù)
			this.sub[event] = []
		}
		// 3.將函數(shù)push到對(duì)應(yīng)的事件中
		this.sub[event].push(fn)
	}
	$emit(event){
		if(this.sub[event]){
			this.sub[event].forEach(fn=>{
				fn() //4.執(zhí)行對(duì)應(yīng)事件中的處理函數(shù)
			})
		}
	}
}
// 信號(hào)中心
const vm = new EventBus()
// 訂閱事件
vm.$on('click',()=>{console.log('觸發(fā)了click事件')})
vm.$on('change',()=>{console.log('觸發(fā)了change事件')})
// 發(fā)布訂閱
vm.$emit('click')
vm.$emit('change')

$emit和$on用法深挖

俗稱的 e m i t 和 emit和 emit和on就是消費(fèi)和定義,咱們?cè)诖a中講解

<body>
    <div id="app">
<button @click="add">測(cè)試</button>

            </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                message:'ok'
            },
            created() {
                this.$on('my_event',this.datalist)
            },
            methods: {
                datalist(e){
               console.log(this.message,e);
               
                },
                add(){
                    this.$emit('my_event','hello wu')
                }
            }
        });
    </script>
</body>

首先剖析一下$on的原理實(shí)現(xiàn)

先在create加個(gè)斷點(diǎn)

我們會(huì)發(fā)現(xiàn)他會(huì)跳到on的源碼中

我們傳入的參數(shù)是兩個(gè),第一個(gè)是我們事件的名稱,第二個(gè)是我們事件處理方法對(duì)應(yīng)的event和fn

  • 首先他把this傳給vm
  • 然后判斷event是不是一個(gè)數(shù)組,如果是個(gè)數(shù)組他就會(huì)以循環(huán)的方式進(jìn)行賦值,繼續(xù)執(zhí)行on的迭代方法,如果不是數(shù)組進(jìn)入else的邏輯判斷去找他是不是包含了event,如果不包含他會(huì)自己創(chuàng)建個(gè)event設(shè)置成空數(shù)組,把新建的處理函數(shù)push進(jìn)去,這說(shuō)明我們?cè)诙x個(gè)事件的時(shí)候,是可以同時(shí)為一個(gè)事件定義多個(gè)執(zhí)行方法,最后找到定義的方法并返回
  • 定義第二種方法看代碼
 var vm = new Vue({
            el: '#app',
            data: {
                message:'ok'
            },
            created() {
                this.$on('my_event',this.datalist)
                this.$on('my_event',this.datalist2)
            },
            methods: {
                datalist(e){
               console.log(this.message,e);
               
                },
                datalist2(e){
               console.log('我是第二種方法',e);
               
                },
                add(){
                    this.$emit('my_event','hello wu')
                }
            }
        });

說(shuō)明定義多個(gè)執(zhí)行方法也是沒(méi)問(wèn)題的

有一點(diǎn)要記住先定義的先觸發(fā)

還有一個(gè)點(diǎn)他是可以是個(gè)數(shù)組,在不同的事件綁定同一個(gè)處理方法,如下代碼

 var vm = new Vue({
            el: '#app',
            data: {
                message:'ok'
            },
            created() {
                this.$on(['my_event','my_event2'],this.datalist)
                console.log(this._events);
                
                // this.$on('my_event',this.datalist2)
            },
            methods: {
                datalist(e){
               console.log(this.message,e);
               
                },
                datalist2(e){
               console.log('我是第二種方法',e);
               
                },
                add(){
                    this.$emit('my_event2','hello wu')
                }
            }
        });

換成第二個(gè)數(shù)組他還是可以實(shí)現(xiàn)

分析$emit

先打個(gè)斷點(diǎn)

1.emit的源碼

2.關(guān)鍵的一步:先通過(guò)名稱改成小寫(xiě)后然后直接從我們vue實(shí)例下劃線events這個(gè)對(duì)象當(dāng)中拿出事件對(duì)應(yīng)的方法,如果找不到什么都不做,直接返回回來(lái),找的話,第一步先判斷cbs的長(zhǎng)度打不打與1,因?yàn)樗锌赡苁莻€(gè)數(shù)組,多個(gè)處理函數(shù)如果大于一就變成了一個(gè)數(shù)組,如果等于一的話直接返回cbs.

第二步他對(duì)arguments做了處理把后面的參數(shù)變成數(shù)組,第一個(gè)不要了 ,因?yàn)槭录Q他用完了,緊接著他對(duì)cbs做了個(gè)循環(huán),

這個(gè)函數(shù)是捕獲處理異常,執(zhí)行try catch,所以說(shuō)如果執(zhí)行emit出了錯(cuò)誤他不會(huì)崩潰,會(huì)拋出錯(cuò)誤,這個(gè)地方做的還不賴 最后把res返回

總結(jié)

可以通過(guò)源碼去理解事半功倍噢

通過(guò)源碼分析我們會(huì)知道on方法在定義的時(shí)候他可以定義多個(gè)事件,也可以為同個(gè)事件綁定多個(gè)處理函數(shù),在定義中還可以是數(shù)組

在emit當(dāng)中進(jìn)行trycate的處理,所以我們拋出異常的時(shí)候我們不會(huì)中斷整個(gè)程序而崩潰

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

相關(guān)文章

  • vue中如何使用唯一標(biāo)識(shí)uuid(uuid.v1()-時(shí)間戳、uuid.v4()-隨機(jī)數(shù))

    vue中如何使用唯一標(biāo)識(shí)uuid(uuid.v1()-時(shí)間戳、uuid.v4()-隨機(jī)數(shù))

    這篇文章主要給大家介紹了關(guān)于vue中如何使用唯一標(biāo)識(shí)uuid(uuid.v1()-時(shí)間戳、uuid.v4()-隨機(jī)數(shù))的相關(guān)資料,當(dāng)使用Vue.js生成UUID時(shí),我們可以使用uuid庫(kù)來(lái)幫助我們生成通用唯一標(biāo)識(shí)符(UUID),需要的朋友可以參考下
    2023-12-12
  • vue常用組件之confirm用法及說(shuō)明

    vue常用組件之confirm用法及說(shuō)明

    這篇文章主要介紹了vue常用組件之confirm用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue-cli擴(kuò)展多模塊打包的示例代碼

    vue-cli擴(kuò)展多模塊打包的示例代碼

    本篇文章主要介紹了vue-cli擴(kuò)展多模塊打包的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • uniapp微信小程序axios庫(kù)的封裝及使用詳細(xì)教程

    uniapp微信小程序axios庫(kù)的封裝及使用詳細(xì)教程

    這篇文章主要給大家介紹了關(guān)于uniapp微信小程序axios庫(kù)的封裝及使用的相關(guān)資料,Axios是一個(gè)基于promise網(wǎng)絡(luò)請(qǐng)求庫(kù),作用于node.js和瀏覽器中axios-miniprogram-adapteraxios的小程序適配器,需要的朋友可以參考下
    2023-08-08
  • vue組件間傳值的方法你知道幾種

    vue組件間傳值的方法你知道幾種

    這篇文章主要為大家詳細(xì)介紹了vue組件間傳值的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Vue2.0 ES6語(yǔ)法降級(jí)ES5的操作

    Vue2.0 ES6語(yǔ)法降級(jí)ES5的操作

    這篇文章主要介紹了Vue2.0 ES6語(yǔ)法降級(jí)ES5的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • vue-router的導(dǎo)航守衛(wèi)使用最新講解

    vue-router的導(dǎo)航守衛(wèi)使用最新講解

    這篇文章主要介紹了vue-router的導(dǎo)航守衛(wèi)使用講解,vue-router提供了許多編程式導(dǎo)航的API,其中最常見(jiàn)的導(dǎo)航API有很多種,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2022-12-12
  • 關(guān)于vite proxy跨域問(wèn)題的解決

    關(guān)于vite proxy跨域問(wèn)題的解決

    這篇文章主要介紹了關(guān)于vite proxy跨域問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 詳解Vue源碼學(xué)習(xí)之雙向綁定

    詳解Vue源碼學(xué)習(xí)之雙向綁定

    這篇文章主要介紹了Vue源碼學(xué)習(xí)之雙向綁定,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 用 Vue.js 遞歸組件實(shí)現(xiàn)可折疊的樹(shù)形菜單(demo)

    用 Vue.js 遞歸組件實(shí)現(xiàn)可折疊的樹(shù)形菜單(demo)

    通過(guò)本文給您演示一下如何有效地使用遞歸組件,我將通過(guò)建立一個(gè)可擴(kuò)展/收縮的樹(shù)形菜單的來(lái)一步步進(jìn)行。下面通過(guò)本文給大家分享用 Vue.js 遞歸組件實(shí)現(xiàn)可折疊的樹(shù)形菜單,需要的朋友參考下吧
    2017-12-12

最新評(píng)論