상세 컨텐츠

본문 제목

[Vue] 컴포넌트 통신방식/데이터 전달방식(props / $emit)

Frontend/Vue

by 사랑짱 2021. 9. 17. 17:22

본문

 

◆ Vue 컴포넌트 통신방식(데이터 전달방식)

 

- 뷰 컴포넌트는 각각 고유한 데이터 유효범위를 갖는다.

- 따라서, 컴포넌트 간에 데이터를 주고받기 위한 규칙이 존재한다.

 

데이터의 흐름(Props/Event)을 추정할 수 있다.

 

 

Props : 상위에서 하위로 데이터를 내려준다. / props를 전달한다.

Event emit : 하위에서 상위로 이벤트를 올려준다. / 이벤트가 발생한다.

 

 


 

 

◆ 상위에서 하위로 데이터 전달 Props

 

- 컴포넌트 간에 데이터를 전달할 수 있는 컴포넌트 통신 방법

- 상위컴포넌트에서 하위 컴포넌트로만 이동!! 

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

▷ 하위컴포넌트의 props 속성 정의
Vue.component('child-component', {
     props: [ 'props 속성이름' ]
});

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<body>
    <div id="app">
        <!--<app-header v-bind:프롭스 속성 이름 ="상위 컴포넌트의 데이터 이름"></app-header>-->
        <app-header v-bind:propsdata ="message"></app-header>
        <app-content v-bind:propsdata ="num"></app-content>
    </div>
 
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 
    <script>
        var appHeader = {
            template: '<h1>{{ propsdata }}</h1>',
            props: ['propsdata']
        }
        var appContent = {
            template: '<div>{{ propsdata }}</div>',
            props: ['propsdata']
        }
        
        new Vue({
            el: '#app',
            components: {
                'app-header': appHeader,
                'app-content': appContent
            },
            data:{
                message: 'hi',
                num : 10
            }
        });
    </script>
</body>
cs

 

 


 

 

◆ 하위에서 상위컴포넌트로 이벤트 전달 $emit

 

- 하위컴포넌트에서 상위 컴포넌트로 이벤트를 발생시키는 통신 방법 

- 이벤트 발생은 $emit( )을 사용, 이벤트 수신은 v-on: 속성 을 사용

▷이벤트 발생 : 하위컴포넌트의 특정 메소드 내부
this.$emit('이벤트명');

▷ 이벤트 수신 
<child-component v-on: 이벤트명 = "상위컴포넌트 method명"></child-component>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<body>
    <div id="app">
<!--<app-header v-on:하위 컴포넌트에서 발생한 이벤트 이름="상위 컴포넌트의 메소드 이름"></app-header>-->
        <app-header v-on:pass="logText"></app-header>
        <app-content v-on:add="logNum"></app-content>
    </div>
 
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 
    <script>
        var appHeader ={
            template: '<button v-on:click="passOn">click me</button>',
            methods: {
                passOn: function(){
                    this.$emit('pass');
                }
            }
        }
 
        var appContent ={
            template: '<button v-on:click="addNumber">add</button>',
            methods: {
                addNumber: function(){
                    this.$emit('add');
                }
            }
        }
        new Vue({
            el: '#app',
            components: {
                'app-header': appHeader,
                'app-content': appContent
            },
            data: {
                num: 10
            },
            methods:{
                logText: function () {
                    console.log('hi');
                },
                logNum: function(){
                    ++this.num;
                    console.log(this.num);
                }
            }
        });
    </script>
</body>
cs

 

 

관련글 더보기