뷰(Vue) 이벤트 버스 객체를 이용한 통신

 

 

뷰에서 부모 - 자식 관계의 컴포넌트는 정보 전달을 위해 props와 events를 사용한다! 하지만 부모-자식 관계가 아닐 경우에는 어떻게 정보 전달이 이루어질까?

 

두 컴포넌트의 관계가 형제 관계 또는 부모와 손자, 증손자 관계일 경우 정보전달을 이벤트 버스(Event Bus) 객체를 만들어 사용한다. 

 

<script>
    var eventBus = new Vue();
</script>

(비어있는 Vue 인스턴스를 만들어 사용)

 

이벤트 버스 객체 활용

 

1. created 이벤트 훅을 이용해 Vue 인스턴스가 만들어질 때 $on 메서드를 사용해 이번트 수신 정보 등록

 

2. 이벤트를 발신하는 컴포넌트에서는 $emit 메서드를 호출

 

 

See the Pen [Vue.js] 뷰 이벤트 버스 객체를 이용한 통신 by junheeleeme (@junheeleeme) on CodePen.

 

child1-component의 버튼을 클릭하면 clickEvent 메서드 실행

 

<!-- 첫 번째 자식 컴포넌트 시작 -->
<template id="child1Template">
    <div>
        <button v-on:click="clickEvent">Child1 Button!</button>
        <div>{{currentTime}}</div>
    </div>
</template>
<script>
    Vue.component('child1-component',
    {
        template : '#child1Template',
        data : function(){
            return {currentTime : ''};
        },
        methods : {
            clickEvent : function(){
                var d = new Date();
                var t = d.toLocaleTimeString() + " " + d.getMilliseconds() + "ms";
                eventBus.$emit('click1', t);
                this.currentTime = t;
            }
        }
})
</script>
<!-- 첫 번째 자식 컴포넌트 끝 -->

 

'child1-component' 이벤트 버스 객체의 $emit 메서드를 이용해 'click1' 이라는 이벤트를 전송하고 'child2-component' 의 created 이벤트 훅에서 $on 메서드로 이벤트를  전달받는다.

 

'click1' 이벤트가 수신되면 child1Click 메서드가 호출되면서 시간 정보를 전달받아 timelist 데이터 옵션에 추가한다.

 

<!-- 두 번째 자식 컴포넌트 시작 -->
<template id="child2Template">
    <ul>
        <li v-for="t in timelist">{{t}}</li>
    </ul>
</template>
<script>
    Vue.component('child2-component', 
    {
        template : '#child2Template',
        data : function(){
            return {
                timelist : []
            };
        },
        created : function(){
            eventBus.$on('click1', this.child1Click);
        },
        methods :{
            child1Click : function(time) {
                this.timelist.push(time);
            }
        }
    }    
)
</script>
<!-- 두 번째 자식 컴포넌트 끝 -->