說一說$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監聽元件