vue中$emit和$on的使用

1. vm.$on(event,callback)

用法:監(jiān)聽當(dāng)前實(shí)例上的自定義事件。事件可以由vm.$emit觸發(fā)?;卣{(diào)函數(shù)會(huì)接收所有傳入事件觸發(fā)函數(shù)的額外函數(shù)。
個(gè)人理解:監(jiān)聽接收傳來的值

vm.$on('test',function(msg){
  console.log(msg)
})

示例:

2. vm.$emit(eventName,[..args])

用法:觸發(fā)當(dāng)前實(shí)例上的事件。附加參數(shù)都會(huì)傳給監(jiān)聽器回調(diào)。
個(gè)人理解: 注冊(cè)一個(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!')  
  }
}

示例:
有時(shí)候項(xiàng)目里面會(huì)遇到子組件與子組件通信。比如以下情況:
頁(yè)面里引入了header組件和content組件,點(diǎn)擊content組件的按鈕,想要改變header組件的內(nèi)容。

<template>
  <div class="home">
    <v-header></v-header>
    <v-content></v-content>
  </div>
</template>
<script>


image.png

(1)首先,在main.js里面全局注冊(cè)一個(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組件注冊(cè)一個(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() {
      // 注冊(cè)一個(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變化如下:


image.png

這樣就可以完成子組件與子組件之間的傳值了,當(dāng)然也可以用Vuex進(jìn)行子組件之間傳值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容