๐ 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>