๐Ÿ“• Language/Vue

[Age of Vue] Vue.js ์‹œ์ž‘ํ•˜๊ธฐ - 16. event emit

a n u e 2022. 5. 2. 23:08

Event๋Š” ํ•˜์œ„์—์„œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ์‹. ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด

 <app-header v-on:ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ ์ด๋ฆ„="์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ ์ด๋ฆ„"></app-header>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <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>
        -->
        <!-- pass๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์•„๋ž˜์—์„œ ์˜ฌ๋ผ์™”์„๋•Œ logText๋ผ๋Š” method๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ผ ! -->
        <app-header v-on:pass="logText"></app-header>

    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var appHeader = {
            //๋ฒ„ํŠผ clickํ–ˆ์„ ๋•Œ, ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Root์—๊ฒŒ Event๋ฅผ ๋ณด๋‚ด์ž
            //method๋ช… ์ •์˜ : passEvent
            template : '<button v-on:click="passEvent">click me</button>',
            methods : {
                //passEvent๋ผ๋Š” method ์ •์˜
                passEvent : function() {
                    //pass๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
                    //์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Root ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•  ์ด๋ฒคํŠธ๋ฅผ ์œ„์—์„œ pass๋ผ๋Š” name์œผ๋กœ ๋ฐ”์ธ๋”ฉ์‹œํ‚ด
                    //๊ทธ๋ฆฌ๊ณ  pass๋กœ ๋ฐ”์ธ๋”ฉ๋  ๋•Œ, 
                    this.$emit('pass');
                }
            }
        }
        new Vue(
            {
                el:'#app',
                components : {
                    'app-header':appHeader
                },
                methods : {
                    logText : function() {
                        console.log('hi');
                    }
                }
            }
        )
    </script>
</body>
</html>

์‹ค์Šต

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <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>
        -->
        <!-- pass๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์•„๋ž˜์—์„œ ์˜ฌ๋ผ์™”์„๋•Œ logText๋ผ๋Š” method๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ผ ! -->
        <app-header v-on:pass="logText"></app-header>
        <app-content v-on:increase="logAdd"></app-content>
        <p>{{ num }}</p>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        var appHeader = {
            //๋ฒ„ํŠผ clickํ–ˆ์„ ๋•Œ, ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Root์—๊ฒŒ Event๋ฅผ ๋ณด๋‚ด์ž
            //method๋ช… ์ •์˜ : passEvent
            template : '<button v-on:click="passEvent">click me</button>',
            methods : {
                //passEvent๋ผ๋Š” method ์ •์˜
                passEvent : function() {
                    //pass๋ผ๋Š” ์ด๋ฆ„์˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
                    //์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Root ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•  ์ด๋ฒคํŠธ๋ฅผ ์œ„์—์„œ pass๋ผ๋Š” name์œผ๋กœ ๋ฐ”์ธ๋”ฉ์‹œํ‚ด
                    //๊ทธ๋ฆฌ๊ณ  pass๋กœ ๋ฐ”์ธ๋”ฉ๋  ๋•Œ, 
                    this.$emit('pass');
                }
            }
        }

        var appContent = {
            template : '<button v-on:click="addNumber">add</button>',
            methods : {
                addNumber : function()
                {
                    //์ด๊ฒƒ ๋˜ํ•œ ์˜์—ญ ๋ณ„๋กœ ์œ ๋‹ˆํฌํ•˜๋ฏ€๋กœ ์ดใ…”๋ฒคํŠธ ๋ช…์นญ์ด pass๋กœ ๋™์ผํ•ด๋„ ๋œ๋‹ค.
                    this.$emit('increase');
                }
            }
        }
        new Vue(
            {
                el:'#app',
                components : {
                    'app-header':appHeader,
                    'app-content':appContent
                },
                methods : {
                    logText : function() {
                        console.log('hi');
                    },
                    logAdd : function() {
                        //ํ•˜๋‹จ์˜ data num์€ this.num์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
                        this.num = this.num + 1;
                        console.log(this.num);
                    }
                },
                data : {
                    num:10
                }
            }
        )
    </script>
</body>
</html>

 

add button ํด๋ฆญ ์‹œ, ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Root์— increase๋ผ๋Š” event๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ +1 ๋œ๋‹ค.