Study/Vue

Vue.js 시작하기 05. 컴포넌트 레벨 간의 통신 방법

going.yoon 2022. 1. 19. 21:03

위에서 아래로는 프롭스, 아래서 위로는 이벤트를 발생시켜 컴포넌트간에 통신을 했다.

그러면 같은 레벨의 컴포넌트 사이에 통신은 어떤식으로 이루어질까?

- Root

   - AppHeader

   - AppContent 

 

이런식의 레벨 구조를 가진 컴포넌트일 때, AppHeader 컴포넌트와, AppContent간의 통신을 구현해보자

데이터 통신의 방식은 다음과 같다.

 

1. AppContent에서 Root로 event로 데이터 전달

2. Root에서 AppHeader로 데이터 전달

 

  <body>
    <div id="app">
        <app-header v-bind:propsData="num"></app-header>   
        <!-- 상위컴포넌트의 num변수와 대응되는 appHeader의 props는 propsData이다 -->
        <app-content v-on:pass="deliverNum"></app-content>   
        <!-- 2. appContent의 pass라는 함수는 상위컴포넌트의 deliverNum함수와 대응 -->
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
      var appHeader = {
          template : '<div>{{propsData}}</div>' ,
          props : ['propsData']
      }  

      var appContent = {
          template : '<div>Content<button v-on:click="passNum">pass</button></div>' ,
          methods : { //1. 버튼을 클릭했을 때 passNum이라는 이벤트를 발생시켜 루트로 전달
              passNum : function () {
                  this.$emit('pass',10)
              }
          }
      }


      new Vue({ 
        el: '#app',
        components : {
            'app-header' : appHeader,
            'app-content' : appContent
        },
        data:{
            num: 0 
        },
        methods : { // 3. 하위컴포넌트에서 받아온 값을 인스턴스 변수에 넣어준다.
          deliverNum : function (value) {
            this.num = value
          }
        }
      })
    </script>
  </body>

 

 

결과물은 다음과 같다.

 

1. AppHeader의 propsData에 값이 잘 들어감

 

2. Root의 데이터에도 값이 잘 들어감

 

 

 

 

해당 포스팅은 인프런의 Vue.js 시작하기 - Age of Vue.js 학습 후 정리한 내용임을 알려드립니다.