1. 程式人生 > >說一說$emit和$on

說一說$emit和$on

一、$emit

1、this $emit('自定義事件名',要傳送的資料);

2、觸發當前例項上的事件,要傳遞的資料會傳給監聽器;

二、$on

1、VM.$on('事件名',callback)    --------------------callback回撥$emit要傳送的資料;

2、監聽當前例項上自定義事件;

三、接下來我們通過一個例項來解釋

1、想要實現的

點選上一頁、下一頁,分別展現那頁的內容。

資料重新整理

廢話不多說,上程式碼

以下是子元件

子元件部分程式碼

子元件js部分

父元件程式碼

 

父元件部分程式碼

 

父元件js部分

首先簡單的點選事件不同去過多的描述,使用v-on:click就可以了,然後在methods裡寫上判斷就可以實現了。

簡單來說,就是子元件pagination想要傳遞curpage給父元件tabs,父元件需要接收到curpage並且要告知子元件,不然子元件完全不知道。

這裡需要強調的一點是:on和emit事件必須是在一個公共的例項上才能觸發。

子元件說:父元件你挺好了,我用$eimt把資料傳給你啊,你記得看看有沒有拿到啊。

父元件說:好的,不怕,我有$on這個東東,我可以隨時監聽到你傳了啥,你傳給我什麼,我就變成什麼唄,沒辦法,你傳給我的,我是要跟隨你的。

旁白:但是你們兩必須得在一個世界啊,別一個在二次元,一個在三次元,那樣沒法傳啊。這樣吧,你們都必須保證在同一個地方吧。

子元件:好,那我這邊有一個bus,父元件那也有一個bus,那我們兩都到那吧。

旁白:一定要記住你們可以使用一個空的 Vue 例項作為中央事件匯流排。畢竟性別不同怎麼談戀愛啊。

父元件在created裡面定義$on監聽事件在子元件中定義點選事件,呼叫父元件方法通過$emit將相應值傳給父元件

網上百度千篇一律全是使用$emit來實現,可是都有一個嚴重的誤區沒有給別人說明,開始我都按照搜尋的結果進行操作,都會出現子元件$emit後父元件沒有監聽到函式的變化,研究了好久才發現$emit和$on的事件必須在一個公共的例項上,才能夠觸發。我的操作如下:

首先在main.js裡新加bus作為一個公共的例項,如下圖

 

bus全域性

 

在子元件中通過$emit觸發元件

 

在父元件中通過$on監聽元件