單向數據流,數據只能從父組件傳入子組件,
子組件用 props
屬性接收父組件数据。
若子組件需要改變父組件的數據:
使用 $on
(eventName) 监听事件
使用 $emit
(eventName) 触发事件
父组件可以在子组件身上用 v-on
来监听子组件触发的事件。
然后再对应「子组件方法」执行处触发事件,两者缺一不可。
(事件處理器就是 function)
<!-- 父组件 #app -->
<div id="app">
<!-- 子组件 myson -->
<myson v-on:son_method="father_method"></myson>
<!-- 父组件在子組件身上,用 v-on 監聽子组件触发的 son_method -->
<!-- 子组件內部要用 $emit 觸發 son_method -->
</div>
// 子组件
Vue.component('myson', {
template: '<button v-on:click="son_method">子按钮</button>',
methods: {
// 按钮点击时候触发 son_method 事件
son_method: function () {
console.log("son");
this.$emit('son_method');
// 用 $emit 將事件發射出去 (可含參數),
// 父組件中的子組件模板,须用 v-on 配合接收事件,
// 因此觸發相應的父組件事件處理器,去更改父組件數據。
// 子組件再被動更新數據。
}
},
});
// 父组件
new Vue({
el: "#app",
methods: {
father_method: function () {
console.log("father");
}
}
});
是一個設計概念,即「事件管理平台」,專門管理事件的發送、監聽。
就像一個廣播中心,你可以請求廣播中心 "發出" $emit
特定事件、
也可以透過它指定 "監聽" $on
該事件。
方法:
this.eventBus.$on( event, callback )
: ('on xxx':'監聽 xxx 事件') | 用於父層元件,接收事件。this.eventBus.$off( [event, callback] )
: 移除監聽的事件this.eventBus.$emit( event, […args] )
: (emit:放射,'emit xxx':'發出 xxx 事件') | 用於子元件,向上傳遞事件與資料,事件可以自訂義。https://ithelp.ithome.com.tw/articles/10186219
釋義
// $bus : 事件管理中心
this.$bus.$emit( 'onUpdateWidget', obj );
// "事件管理中心" 發出 'onUpdateWidget' 事件、並傳遞參數 obj
this.$bus.$on( 'xxx', callback )
// "事件管理中心" 監聽 'xxx' 事件、發生就執行 callback