본문 바로가기

Frontend

Vue.js (4) 컴포넌트 간 통신

상위 → 하위 데이터 전달(props)

하위 → 상위 이벤트 전달(emit)

 

같은 레벨 간 통신: 공통 상위 컴포넌트를 경유하여 emit과 props를 활용하여 전달한다. 불필요하게 상위 컴포넌트를 두어야 하는 경우가 생긴다. 이러한 단점을 해결하는것이 이벤트 버스이다.

관계 없는 컴포넌트 간 통신: 이벤트 버스를 활용한다. 이벤트 버스용 뷰 객체 생성 후 emit과 on을 활용하여 구현한다.

 

<!DOCTYPE html>
<html>
  <head>
    <title>Vue Component Comm</title>
  </head>
  <body>
    <div id="app">
      <child-component v-bind:propsdata="message"></child-component>
      <child-component-2 v-on:child-event="childEvent"></child-component-2>
      <child-component-3></child-component-3>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script>
      var eventBus = new Vue();
      Vue.component('child-component', {
        props: ['propsdata'],
        template: '<p>{{ propsdata }}</p>'
      });
      Vue.component('child-component-2', {
        template: '<button v-on:click="emitEvent">ChildEvent</button>',
        methods: {
          emitEvent: function() {
            this.$emit('child-event');
          }
        }
      });
      Vue.component('child-component-3', {
        template: '<button v-on:click="sendData">EventBus</button>',
        methods: {
          sendData: function() {
            eventBus.$emit('triggerEventBus', 'Oh, passed through the EventBus');
          }
        }
      });

      new Vue({
        el: '#app',
        data: {
          message: 'Hello Vue! passed from parent component'
        },
        methods: {
          childEvent: function() {
            this.message = "Received an event from Child-Component";
          },
          onReceive: function(value) {
            this.message = value;
          }
        },
        created: function() {
          eventBus.$on('triggerEventBus', this.onReceive);
        }
      });
    </script>
  </body>
</html>

'Frontend' 카테고리의 다른 글

Vue.js (6) HTTP 통신  (0) 2020.04.23
Vue.js (5) 라우터  (0) 2020.04.21
Vue.js (3) 인스턴스와 컴포넌트  (0) 2020.04.11
Vue.js (2) 환경구축  (0) 2020.04.11
Vue.js (1) 시작  (0) 2020.04.08