爲了方便展現,全部的組件都是以 單文件組件的方式編寫的
在父組件內使用v-on
綁定自定義事件,在子組件內使用props
傳遞 自定義的事件名稱
以下是父組件
javascript
<template> <div id="app"> <child :message="title"/> <!--使用v-on綁定自定義事件--> </div> </template> <script> import Child from './components/Child' // 導入子組件 export default { name: 'App', components: {Child}, // 註冊子組件 data() { return { title: '父組件向我傳遞了信息' } } } </script>
以下是子組件
html
<template> <div id="app"> {{message}} </div> </template> <script> export default { props: ['message'] // 使用props傳遞數據 } </script>
<!--more-->vue
子組件對父組件通訊咱們只能經過
自定義事件
去進行觸發,而沒法像
父對子通訊那樣直接進行數據傳遞
首先咱們必須瞭解Vue暴露兩個實例方法java
vm.$emit( event, […args] )
,觸發當前實例上的事件,附加參數都會傳給監聽器回調 vm.$on( event, callback )
,監聽當前實例上的自定義事件,事件能夠由vm.$emit觸發,回調函數會接收全部傳入事件觸發函數的額外參數 總結一下:咱們用$on去監聽一個**自定義事件**,這個自定義事件由$emit觸發,觸發的同時將data
放在附加參數裏,傳給$on接收app
以下是父組件
函數
<template> <div id="app"> <child v-on:receiveData="consoleData"/> <!--監聽自定義事件receiveData,監聽到以後觸發consoleData獲取子組件傳遞的數據--> </div> </template> <script> import Child from './components/Child' // 導入子組件 export default { name: 'App', components: {Child}, // 註冊子組件 methods: { consoleData(data) { // 這裏的參數是由$emit傳遞來的數據 console.log(data) // ["子組件向我傳遞信息啦", "測試"] } } } </script>
以下是子組件
測試
<template> <div id="app"> <button @click="transData">點我,向父組件傳遞數據</button> <!--綁定transData事件,以便執行器內部的$emit--> </div> </template> <script> export default { data() { return { message: '子組件向我傳遞信息啦', title: '測試' } }, methods: { transData() { // 觸發自定義事件receiveData,將數據傳遞給父組件 this.$emit('receiveData', [this.message, this.title]) } } } </script>
主要咱們經過全局註冊一個eventBus
單文件組件,這個組件的做用充當着vm.$emit( event, […args] )
裏的vm
,其它形式與第二小節相似,不做過多說明了
新建一個js文件,做爲EventBusthis
import Vue from 'vue' // 導入vue模塊 export default new Vue({}) // 新建一個空的vue實例做爲EventBus
以下是父組件
code
<template> <div id="app"> <!--兩個子組件--> <child1/> <child2/> </div> </template> <script> import Child1 from './components/Child' // 導入子組件1 import Child2 from './components/child2' // 導入子組件2 export default { name: 'App', components: {Child1, Child2}// 註冊兩個子組件 } </script>
以下是子組件1
component
<template> <div> <button @click="transData">點我,向兄弟組件Child2傳遞數據</button> <!--綁定transData事件,以便執行器內部的$emit--> </div> </template> <script> import eventBus from './EventBus' // 導入EventBus export default { data() { return { message: 'Child2,你好呀', title: '測試' } }, methods: { transData() { // 經過EventBus觸發自定義事件receiveData,將數據傳遞給Child2組件 eventBus.$emit('receiveData', [this.message, this.title]) } } } </script>
以下是子組件2
<template> <div> <h1>個人兄弟組件Child1向我傳遞了信息:{{message}}</h1> <!--綁定transData事件,以便執行器內部的$emit--> </div> </template> <script> import eventBus from './EventBus' // 導入EventBus export default { data() { return { message: '' } }, created() { eventBus.$on('receiveData', data => { // 注意這裏使用箭頭函數是由於須要將this綁定父級的context,不然this指向eventBus this.message = data }) } } </script>