송민준의 개발노트

컴포넌트 통신 본문

웹/Vue

컴포넌트 통신

송민준 2020. 1. 31. 17:11

뷰 인스턴스(상위 컴포넌트)  -> (props를 통해 데이터 전달)  -> child-component(하위 컴포넌트)

- 따로 설정은 안해줬지만 컴포넌트를 등록함과 동시에 뷰 인스턴스 자체가 상위 컴포넌트가 된다.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Vue Sample</title>
  </head>
  <body>
    <div id="app">
      <child-component v-bind:propsdata="message"></child-component>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script>
      Vue.component('child-component', {
        props: ['propsdata'],
        template: '<p>{{propsdata}}</p>'
      });
      new Vue({
        el: '#app',
        data: {
          message: 'Hello Vue! passed from Parent Component'
        }
      });
    </script>
  </body>
</html>

 

 

이벤트 발생과 수신

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Vue Sample</title>
  </head>
  <body>
    <div id="app">
      <child-component v-on:show-log="printText"></child-component>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script>
      Vue.component('child-component', {
        template: '<button v-on:click="showLog">show</button>',
        methods: {
          showLog: function() {
            this.$emit('show-log');
          }
        }
      });
      var app = new Vue({
        el: '#app',
        data: {
          message: 'Hello Vue! passed from Parent Component'
        },
        methods: {
          printText: function() {
            console.log("received an event");
          }
        }
      });
    </script>
  </body>
</html>

이벤트 버스 구현

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Vue Sample</title>
  </head>
  <body>
    <div id="app">
      <child-component></child-component>
    </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', {
        template: '<div>하위 컴포넌트 영역입니다.<button v-on:click="showLog">show</button></div>',
        methods: {
          showLog: function() {
            eventBus.$emit('triggerEventBus', 100);
          }
        }
      });
      var app = new Vue({
        el: '#app',
        created: function() {
          eventBus.$on('triggerEventBus', function(value) {
            console.log("이벤트를 전달받음. 전달받은 값 : ", value);
          });
        }
      });
    </script>
  </body>
</html>

* 중 대형 어플리케이션에서는 뷰엑스 라이브러리를 사용하는게 좋음

' > Vue' 카테고리의 다른 글

뷰 템플릿  (0) 2020.02.09
뷰 리소스, 액시오스  (0) 2020.02.08
뷰 라우터  (0) 2020.02.02
컴포넌트  (0) 2020.01.31
라이프 사이클  (0) 2020.01.31