본문 바로가기
JS 프레임워크/Vue

뷰 컴포넌트 통신

by 두리두리안 2021. 4. 1.

컴포넌트 간 통신과 유효 범위 


뷰의 경우 컴포넌트로 화면을 구성하므로 같은 웹 페이지라도 데이터를 공유할 수 없다. 

컴포넌트 자체적으로 고유한 유효 범위를 갖기 때문이다. 이는 뷰 프레임워크 내부적으로 정의된 특징이다. 

각 컴포넌트의 유효 범위가 독립적이기 때문이다. 

 

컴포넌트 유효 범위 증명 코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <my-component1></my-component1>
        <my-component2></my-component2>
    </div>      
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script>
        // 첫번째 컴포넌트
        var cmp1 = {
            template: '<div>첫 번째 지역 컴포넌트 : {{cmp1Data}}</div>',
            data: function(){
                return{
                    cmp1Data: 100
                }
            }
        };
        // 두번째 컴포넌트
        var cmp2 = {
            template: '<div>두 번째 지역 컴포넌트 : {{cmp2Data}}</div>',
            data: function(){
                return{
                    cmp2Data: cmp1.data.cmp1Data
                }
            }
        };
        new Vue({
            el: '#app',
            // 지역 컴포넌트 등록
            components: {
                'my-component1' : cmp1,
                'my-component2' : cmp2,
            }
        })
    </script>
</body>
</html>

상 하위 컴포넌트 관계

기본적인 데이터 전달 방법은 상하위 컴포넌트 간의 데이터 전달 방법이다. 

상위-하위 컴포넌트란 트리 구조에서 부모 노드, 자식 노드처럼 컴포넌트 간의 관계가 부모.자식으로 이루어진 컴포넌트를 의미한다.

상위에서 하위 컴포넌트로 데이터 전달하기

 

props속성

props는 상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달할 때 사용하는 속성이다. 

 

상위 컴포넌트의 HTML코드에 등록된 child-component컴포넌트 태그에 v-bind속성을 추가한다.

<child-component v-bind:props 속성 이름="상위 컴포넌트의 data속성"></child-component>

 v-bind 속성의 왼쪽 값으로 하위 컴포넌트에서 정의한 props속성을 넣고, 오른쪽 값으로 하위 컴포넌트에 전달할 상위 컴포넌트의 data속성을 지정 

 

props 속성을 사용한 데이터 전달 예제 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <child-component v-bind:propsdata="message"></child-component>
        <!-- propsdata : props속성 이름 -->
        <!-- message : 상위 컴포넌트의 데이터 속성 -->
    </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>

컴포넌트 간의 관계

child-component를 전역으로 등록한 것 이외에 딱히 상위 컴포넌트를 지정하지 않는다.

뷰 인스턴스 안에 마치 상위 컴포넌트가 존재하는 것처럼 하위 컴포넌트로 props를 내려보냈습니다. 그 이유는 

컴포넌트를 등록함과 동시에 뷰 인스턴스 자체가 상위 컴포넌트가 되기 때문이다.

인스턴스에 새로운 컴포넌트를 등록하면 기존에 있는 컴포넌트는 상위 컴포넌트가 되고 새로 등록된 컴포넌트는 하위 컴포넌트가 된다. 

 

'JS 프레임워크 > Vue' 카테고리의 다른 글

[Vue] Vue 라우트  (0) 2021.04.06
뷰 컴포넌트  (0) 2021.03.31
Vue 인스턴스  (0) 2021.03.31
Vue 환경설정 및 Hello world  (0) 2021.03.30
Vue JS란  (0) 2021.03.30