부모 컴포넌트 -> 자식 컴포넌트 props를 전달하거나 자식 컴포넌트 -> 부모 컴포넌트로 events를 발생시켜 전달하는 것 외에도
형제 컴포넌트끼리 데이터를 통신할 수 있는 방법이 EventBus이다.
** EventBus는 컴포넌트가 많지 않아 규모가 작은 프로젝트에 사용해야 한다. (대규모 프로젝트에서는 vuex를 사용)
😐 이벤트버스 생성 방법
EventBus는 쉽게 말해 비어있는 Vue 인스턴스 객체라고 할 수 있다.
이 인스턴스를 독립적인 각 컴포넌트끼리 통신할 때 중간 다리로 활용한다.
(데이터 전달 방향 : vue components -> EventBus -> vue component)
import Vue from "vue";
var EventBus = new Vue();
🤪 이벤트버스 사용 방법
EventBus는 전달자 역할만 하는 빈그릇일 뿐이고 사용방법은 자식이 부모에게 events를 사용하여 데이터를 전달한 방법과 동일하다.
데이터를 보내는 컴포넌트의 events에서 $emit을 사용하여 eventBus 객체에 값을 넣어주면 된다.
// 이벤트(데이터)를 보내는 컴포넌트 => EventBus.$emit('이벤트명', data);
// 이벤트를 보내는 컴포넌트
<template>
<section>
<button @click="clickEvent"></button>
</section>
</template>
<script>
import { EventBus } from "./경로";
export default {
data() {
return {
clickCount: 0;
}
},
methods: {
clickEvent() {
this.clickedCount++;
EventBus.$emit('use-evetbus', this.clickedCount);
// 'use-eventbus'의 이벤트 이름으로 clickedCount 데이터를 포함해서 내보낸다.
}
}
};
</script>
// 이벤트(데이터)를 받는 컴포넌트 => EventBus.$on('이벤트명', 콜백함수);
// 이벤트를 받는 컴포넌트
<template>
<section>{{ receivedClickCount }}</section>
</template>
<script>
import { EventBus } from '경로';
export default {
data() {
return {
receivedClickCount: 0
}
},
created() { // 첫번째 파라미터는 이벤트명, 두번째 파라미터는 콜백함수
EventBus.$on('use-eventbus', clickedCount => {
this.receiveClickCount = clickedCount;
}
}
};
</script>
이벤트를 받을 때 $on 메서드를 활용해서 첫번째 파라미터에 이벤트 이름, 두번째 파라미터로는 콜백함수를 지정한다.
콜백함수에서의 파라미터로 EventBus를 내보낼 때 지정한 데이터를 받아볼 수 있다.
이벤트를 한번만 받아보고자 한다면 $on 대신 $once를 사용하면 된다.
// 이벤트버스 해제
EventBus.$off('use-EventBus');
해당 이벤트 이름을 가진 EventBus가 아닌 모든 EventBus 를 해제하고자 한다면 EventBus.$off();를 사용하면 된다.
'Vue.js' 카테고리의 다른 글
vue axios 사용하여 서버 통신 (0) | 2022.03.22 |
---|---|
vue 컴포넌트 사용 시 알아두면 좋은 6가지 (0) | 2022.03.22 |
Vue 이벤트 (0) | 2022.03.22 |
Vue 인스턴스 주요 옵션 (0) | 2022.03.22 |
vue.js 기본 directive (0) | 2022.03.22 |