๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JavaScript/Vue

ํ•˜์œ„์—์„œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋ฒคํŠธ ์ „๋‹ฌํ•˜๊ธฐ : $emit

by ์ฝ”๋”ฉํ•˜๋Š” ๋ถ•์–ด 2022. 6. 5.
๋ฐ˜์‘ํ˜•

์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค.

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

 

 

์ด๋ฒคํŠธ ๋ฐœ์ƒ๊ณผ ์ˆ˜์‹ ์€ $emit()๊ณผ v-on: ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

// ์ด๋ฒคํŠธ ๋ฐœ์ƒ
this.$emit('์ด๋ฒคํŠธ๋ช…')

$emit์„ ํ˜ธ์ถœํ•˜๋ฉด ๊ด„ํ˜ธ ์•ˆ์— ์ •์˜๋œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ $emit()์„ ํ˜ธ์ถœํ•˜๋Š” ์œ„์น˜๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์ด๋‹ค.

๋”ฐ๋ผ์„œ $emit()์„ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” this๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

 

// ์ด๋ฒคํŠธ ์ˆ˜์‹ 
<child-component v-on:์ด๋ฒคํŠธ๋ช…="์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ๋ช…"></child-component>

ํ˜ธ์ถœํ•œ ์ด๋ฒคํŠธ๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ํƒœ๊ทธ์—์„œ v-on: ์œผ๋กœ ๋ฐ›๋Š”๋‹ค. ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ช…์„ v-on: ์†์„ฑ์— ์ง€์ •ํ•˜๊ณ , ์†์„ฑ์˜ ๊ฐ’์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋  ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

 

<!DOCTYPE html>
<head>
  <title>Event emit</title>
</head>
<body>
  <div id="app">
    <child-component v-on:show-log="printText"></child-component2>
  </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    Vue.component('child-component', {
      template: '<button v-on:click="showLog">show</button>',
      methods: {
        showLog: function() {
          this.$emit('show-log')
        }
      }
    })

    var app = new Vue({
      el: '#app',
      data: {
        message: "Hello Vue! passed from Parent Component"
      },
      methods: {
        printText: function() {
          console.log('received an event')
        }
      }
    })
  </script>
</body>
</html>

 

 

<์ฒ˜๋ฆฌ ๊ณผ์ •>

1. show ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํด๋ฆญ ์ด๋ฒคํŠธ v-on:click="showLog"์— ๋”ฐ๋ผ showLog() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

2. showLog() ๋ฉ”์„œ๋“œ ์•ˆ์— this.$emit('show-log')๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ show-log ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

3. show-log ์ด๋ฒคํŠธ๋Š” <child-component>์— ์ •์˜ํ•œ v-on:show-log์— ์ „๋‹ฌ๋˜๊ณ , v-on:show-log์˜ ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์ธ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ printText()๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

4. printText()๋Š” received an event๋ผ๋Š” ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝ˜์†”์— ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

 

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€