Eventbus可以達成跨元件的資料傳遞,這個範例只是作為Eventbus效果的示範,依據實際的應用時,不一定使用eventbus是最合適的,可以考量使用props/emit父子元件的傳遞方式,或是vuex來需要共用的資源。
先參考一下整體的檔案結構:
├── App.vue ├── components │ ├── Button.vue │ └── DisplayBoard.vue ├── libs │ └── eventbus.js └── main.js
eventbus.js
import Vue from 'vue'; export const EventBus = new Vue();
MyButton.js
傳遞eventbus的元件,當按下按鈕時,會將目前的值傳出去,以$emit發出一個 "add-count" 的事件。
<template>
<button @click="onClickCountAdd">Click</button>
</template>
<script>
// Import the EventBus we just created.
import { EventBus } from '../libs/eventbus.js';
export default {
data() {
return {
clickCount: 0,
}
},
methods: {
onClickCountAdd() {
this.clickCount++;
// Send the event on a channel (add-count) with a payload (the click count.)
EventBus.$emit('add-count', this.clickCount);
}
}
}
</script>DisplayBoard.js
註冊eventbus的元件,$on是註冊;$off是取消,兩者必須成雙出現,可以避免產生重複綁定。display-board註冊 "add-count" 的事件,後面的參數是時間接收到事件時,負責處理的method。
<template>
<div v-text="displayCount" />
</template>
<script>
// Import the EventBus we just created.
import { EventBus } from '../libs/eventbus.js';
export default {
data() {
return {
displayCount: 0,
}
},
created() {
this.handleClick = this.handleClick.bind(this);
// Listen to the event.
EventBus.$on('add-count', this.handleClick);
},
destroyed() {
// Stop listening.
EventBus.$off('add-count', this.handleClick);
},
methods: {
handleClick(clickCount) {
this.displayCount = clickCount;
}
}
}
</script>App.js
<template>
<div>
<my-button />
<display-board />
</div>
</template>
<script>
import MyButton from './components/MyButton'
import DisplayBoard from './components/DisplayBoard'
export default {
components: {
MyButton,
DisplayBoard,
}
}
</script>最終成果,隨著my-button內按鍵點擊,display-board需呈現目前的點擊數。
沒有留言:
張貼留言