vue中關(guān)于$emit和$on的使用及說明
$emit和$on的使用及說明
1. vm.$on(event,callback)
用法:監(jiān)聽當(dāng)前實(shí)例上的自定義事件。事件可以由vm.$emit觸發(fā)?;卣{(diào)函數(shù)會接收所有傳入事件觸發(fā)函數(shù)的額外函數(shù)。
個(gè)人理解:監(jiān)聽接收傳來的值
vm.$on('test',function(msg){
console.log(msg)
})示例:
2. vm.$emit(eventName,[…args])
用法:觸發(fā)當(dāng)前實(shí)例上的事件。附加參數(shù)都會傳給監(jiān)聽器回調(diào)。
個(gè)人理解: 注冊一個(gè)自定義事件
// 只配合一個(gè)事件名使用emit
// 子組件
Vue.component('welcome-button',{
template: `
<button @click="$emit('welcome')">點(diǎn)擊按鈕</button>
`
})
// 父組件
<div>
<welcome-button v-on:welcome="sayHi"></welcome-button>
</div>
...
...
...
methods: {
sayHi() {
alert('Hi!')
}
}3.示例
有時(shí)候項(xiàng)目里面會遇到子組件與子組件通信。比如以下情況:
頁面里引入了header組件和content組件,點(diǎn)擊content組件的按鈕,想要改變header組件的內(nèi)容。
<template>
<div class="home">
<v-header></v-header>
<v-content></v-content>
</div>
</template>
<script>
(1)首先,在main.js里面全局注冊一個(gè)eventbus的方法
import Vue from 'vue';
import App from './App.vue';
import router from './router';
Vue.config.productionTip = false;
Vue.prototype.$EventBus = new Vue();
new Vue({
router,
render: h => h(App),
}).$mount('#app')(2)然后在content組件注冊一個(gè)自定義事件:
<template>
<div class="content">
<img alt="Vue logo" src="../assets/logo.png">
<button @click="changeEvent">I am content!</button>
</div>
</template>
<script>
export default {
name: 'Content',
methods: {
changeEvent() {
// 注冊一個(gè)自定義事件
this.$EventBus.$emit("changeNum",123)
}
}
}
</script>
<style scoped>
button{
width: 200px;
height: 50px;
display: block;
margin: 0 auto;
border: none;
color: #fff;
font-size: 20px;
border-radius: 6px;
background: #007ef3;
}
</style>(3)在header組件監(jiān)聽接收這個(gè)值:
<template>
<div class="header">
<h1>{{headStr}}</h1>
</div>
</template>
<script>
export default {
name: 'Header',
data(){
return{
headStr:"This is my head!"
}
},
created() {
// 監(jiān)聽接收這個(gè)值
this.$EventBus.$on("changeNum", (val) => {
this.headStr = val;
});
}
}
</script>
<style scoped>
</style>點(diǎn)擊按鈕,header變化如下:

這樣就可以完成子組件與子組件之間的傳值了,當(dāng)然也可以用Vuex進(jìn)行子組件之間傳值。
$emit和$on(在同一個(gè)組件中的用法 )
百度之后,終于明白$emit 和 $on 的基礎(chǔ)用法。不多說 ,直接上課。
- $on('事件名字'); /監(jiān)聽事件,事件名字是 str型
- $emit('事件名字',回調(diào)函數(shù));//事件名字是 str型,當(dāng)然,可以有多個(gè)事件名字,如果存在多個(gè)事件名字,那么就是用數(shù)組。
假設(shè)有一個(gè)按紐,希望在點(diǎn)擊按紐之后觸發(fā)某一個(gè)方法。那么我們可以這樣。
<button @click='emit'>只觸發(fā)一個(gè)方法</button>
created () {
this.$on('wash_Goods',(arg)=> {
console.log(arg)//這兒的arg能接收到 下面的參數(shù)
})
},
methods : {
emit () {
this.$emit('wash_Goods',['fish',true,{name:'vue',verison:'2.4'}])
}
}我們可以這樣子去理解,首先,點(diǎn)擊按紐,它就會走emit的方法。 在該方法中。遇到emit,那么它就會找它需要監(jiān)聽到washGoods的事件,找啊找。
然后,它在created的生命周期中找到了。原來,在created生命周期中有一個(gè)叫this.on(‘wash_Goods’)的監(jiān)聽事件。同時(shí),該事件會有一個(gè)對應(yīng)的執(zhí)行方法。那么,它就會順著走下去,直接執(zhí)行 剛在 this.$on(‘wash_Goods’)的監(jiān)聽方法。
this.$on('wash_Goods',(arg)=> {
console.log(1)
console.log(arg)//這兒的arg能接收到 下面的參數(shù)
})
this.$on('wash_Goods',(arg)=> {
console.log(2)
console.log(arg)//這兒的arg能接收到 下面的參數(shù)
})
this.$on('wash_Goods',(arg)=> {
console.log(3)
console.log(arg)//這兒的arg能接收到 下面的參數(shù)
})
//那么,這個(gè)按紐在點(diǎn)擊之后就會觸發(fā)這三個(gè)方法。
或許,有同學(xué)會問了,剛我提到,在監(jiān)聽事件晨在,監(jiān)聽的事件可以是數(shù)組。沒錯(cuò),是數(shù)組,即
<button @click='emit'>只觸發(fā)一個(gè)方法</button>
created () {
? ? this.$on('wash_Goods',(arg)=> {
? ? ? ? console.log('執(zhí)行1')
? ? ? ? console.log(arg)
? ? })
? ? this.$on(['wash_Goods','abcdef'],(arg)=> {
? ? ? ? console.log('執(zhí)行2') //這個(gè)也會被執(zhí)行
? ? ? ? console.log(arg)
? ? })
},
methods : {
? ? emit () {
? ? ? ? this.$emit('wash_Goods',['fish',true,{name:'vue',verison:'2.4'}])
? ? }
}這兒的數(shù)組也可以這樣子理解,當(dāng)觸發(fā)按紐的時(shí)候,它去尋找需要監(jiān)聽事件時(shí),不管找到的是字符串還是數(shù)組,只要監(jiān)聽的事件名字中有相對應(yīng)的名字,它都會執(zhí)行?!敬騻€(gè)生活中的小例子,哪兒都有你?!?nbsp;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決vue keep-alive 數(shù)據(jù)更新的問題
今天小編就為大家分享一篇解決vue keep-alive 數(shù)據(jù)更新的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue+element-ui前端使用print-js實(shí)現(xiàn)打印功能(可自定義樣式)
Print.js主要是為了幫助我們直接在瀏覽器中開發(fā)打印功能,下面這篇文章主要給大家介紹了關(guān)于vue+element-ui前端使用print-js實(shí)現(xiàn)打印功能(可自定義樣式)的相關(guān)資料,需要的朋友可以參考下2022-11-11
vue中使用go()和back()兩種返回上一頁的區(qū)別說明
這篇文章主要介紹了vue中使用go()和back()兩種返回上一頁的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Vue3中watchEffect和watch的基礎(chǔ)應(yīng)用詳解
watch是一個(gè)偵聽器,默認(rèn)是懶偵聽的,即僅在偵聽源發(fā)生變化時(shí)才執(zhí)行回調(diào)函數(shù),watchEffect是會自動收集函數(shù)里面變量的響應(yīng)式依賴,本文主要來講講二者的區(qū)別,感興趣的可以了解一下2023-07-07
微信小程序?qū)崙?zhàn)基于vue2實(shí)現(xiàn)瀑布流的代碼實(shí)例
瀑布流,又稱瀑布流式布局,是比較流行的一種網(wǎng)站頁面布局,視覺表現(xiàn)為參差不齊的多欄布局,隨著頁面滾動條向下滾動,這種布局還會不斷加載數(shù)據(jù)塊并附加至當(dāng)前尾部,這篇文章主要介紹了微信小程序?qū)崙?zhàn),基于vue2實(shí)現(xiàn)瀑布流,需要的朋友可以參考下2022-12-12
vue 獲取到數(shù)據(jù)但卻渲染不到頁面上的解決方法
這篇文章主要介紹了vue 獲取到數(shù)據(jù)但卻渲染不到頁面上的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
vue2路由方式--嵌套路由實(shí)現(xiàn)方法分析
這篇文章主要介紹了vue2嵌套路由實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了vue2嵌套路由基本實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03

