정리/Vue.js

Vue.js 컴포넌트 통신 / Vue.js 이벤트 emit

알렉스 페레이라 2023. 9. 19. 15:30

※이벤트는 올라가고 데이터(props)는 내려온다

 

하위 컴포넌트로 데이터(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">
        <!--<app-header v-bind:프롭스 속성 이름 ="상위 컴포넌트의 데이터 이름"></app-header> -->
        <app-header v-bind:propsdata="message"></app-header>
        <app-content v-bind:propscontent="num"></app-content>
    </div>

</body>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    //컴포넌트의 변수화
    var appHeader = {
        //html
        template: '<h1>{{propsdata}}</h1>',
        //mapping id
        props:['propsdata']
    }

    var appContent = {
        template : '<div>{{propscontent}}</div>',
        props:['propscontent']
    }

    new Vue({
        //Root
        el : '#app',
        //자식 컴포넌트들
        components : {
            'app-header' : appHeader,
            'app-content' : appContent
        },
        //데이터들
        data : {
            message : 'hi',
            num : 10
        }
    })
</script>
</html>

 

상위 컴포넌트로 이벤트(emit)발생시키기

<!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">
        <!-- <app-header v-on:하위컴포넌트에서 발생한 이벤트 이름="상위 컴포넌트의 메소드 이름"></app-header> -->
        <app-header v-on:pass="logText"></app-header>
        <app-content v-on:add="addNumber"></app-content>
    </div>
    
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var appHeader = {
        template: '<button v-on:click="passEvent">click</button>',
        methods: {
            passEvent: 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 : 1
        },
        methods:{
            logText: function(){
                console.log('hi');
            },
            addNumber: function(){
                this.num +=1;
                console.log(this.num);
            }
        }
    });
</script>
</html>

 

같은 컴포넌트 레벨간의 통신방법

컴포넌트에서는 데이터를 root로 emit하고, root에서는 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>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <app-header v-bind:propsdata="num"></app-header>
        <app-content v-on:pass="deliverNum"></app-content>
    </div>

    <script>
        var appHeader={
            template:'<div>값 : {{propsdata}}</div>',
            props:['propsdata']
        }
        var appContent={
            template:'<div>content<button v-on:click="passNum">pass</button></div>',
            methods: {
                passNum: function(){
                    this.$emit('pass', 10);
                }
            },
        }

        new Vue({
            el:'#app',
            components:{
                'app-header' : appHeader,
                'app-content' : appContent
            },
            data:{
                num: 0
            },
            methods:{
                deliverNum:function(num){
                    this.num = num;
                }
            }
        });
    </script>
</body>
</html>

'정리 > Vue.js' 카테고리의 다른 글

Vue.js 2와 Vue.js3의 차이  (0) 2023.09.21
Vue.js 라우터란?  (0) 2023.09.20
Vue.js란? / Vue.js 인스턴스 / Vue.js 컴포넌트  (0) 2023.09.15
Vue.js 개발환경 파일  (0) 2023.09.15
Vue.js 새 프로젝트 생성하기  (1) 2023.09.13