๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Development/Vue.js

Vue.js - Pass Props & Emit Events

by DevIseo 2022. 5. 9.

๐Ÿ””Pass Props & Emit Events

|์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ

  • Vue app์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ค‘์ฒฉ๋œ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ
  • ์ปดํฌ๋„ŒํŠธ๊ฐ„ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๊ฐ€ ๊ตฌ์„ฑ๋˜๋ฉฐ ์ด๋“ค ์‚ฌ์ด์— ํ•„์—ฐ์ ์œผ๋กœ ์˜์‚ฌ ์†Œํ†ต์ด ํ•„์š”ํ•จ

  • ๋ถ€๋ชจ๋Š” ์ž์‹์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ**(Pass props)ํ•˜๋ฉฐ, ์ž์‹์€ ์ž์‹ ์—๊ฒŒ ์ผ์–ด๋‚œ ์ผ์„ ๋ถ€๋ชจ์—๊ฒŒ ์•Œ๋ฆผ(Emit event)**
    • ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ฒฉ๋ฆฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ
  • “props๋Š” ์•„๋ž˜๋กœ, events๋Š” ์œ„๋กœ”
  • ๋ถ€๋ชจ๋Š” props๋ฅผ ํ†ตํ•ด ์ž์‹์—๊ฒŒ ‘๋ฐ์ดํ„ฐ’๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์ž์‹์€ events๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ์—๊ฒŒ ‘๋ฉ”์‹œ์ง€’๋ฅผ ๋ณด๋ƒ„

|์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

  1. ํ…œํ”Œ๋ฆฟ (HTML)
  2. ์Šคํฌ๋ฆฝํŠธ (JavaScript)
  3. ์Šคํƒ€์ผ (CSS)

|ํ…œํ”Œ๋ฆฟ(HTML)

  • HTML์˜ body ๋ถ€๋ถ„
  • ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑ
  • ๋งˆํฌ์—… ์ž‘์„ฑ ๋ถ€๋ถ„

|์Šคํฌ๋ฆฝํŠธ(JavaScript)

  • JavaScript๊ฐ€ ์ž‘์„ฑ๋˜๋Š” ๊ณณ
  • ์ปดํฌ๋„ŒํŠธ ์ •๋ณด, ๋ฐ์ดํ„ฐ, ๋ฉ”์„œ๋“œ ๋“ฑ vue ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์ด ์ž‘์„ฑ ๋จ

|์Šคํƒ€์ผ(CSS)

  • CSS๊ฐ€ ์ž‘์„ฑ๋˜๋ฉฐ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ์„ ๋‹ด๋‹น

 

 

 

|์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก 3๋‹จ๊ณ„

  1. ๋ถˆ๋Ÿฌ์˜ค๊ธฐ (import)
  2. ๋“ฑ๋กํ•˜๊ธฐ (register)
  3. ๋ณด์—ฌ์ฃผ๊ธฐ (print)
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <!-- 3.๋ณด์—ฌ์ฃผ๊ธฐ(print) -->
    <!-- ์นด๋ฉœ ์ผ€์ด์Šค -->
    <!-- <TheAbout :my-message="parentData" /> -->
    <!-- ์ผ€๋ฐฅ ์ผ€์ด์Šค -->
    <the-about :my-message="parentData" @child-input-change="parentGetChange"></the-about>
  </div>
</template>

<script>
//1.๋ถˆ๋Ÿฌ์˜ค๊ธฐ(import)###
import TheAbout from './components/TheAbout.vue'

export default {
  name: 'App',
  //2.๋“ฑ๋กํ•˜๊ธฐ(register)
  components: {
    TheAbout,
  },
  data: function() {
    return {
      parentData: 'this is parent data to child comp'

    }
  },
  methods:{
    parentGetChange:function(inputData){
      console.log('๋“ค๋ฆฌ๋Š”๊ตฐ..',inputData)
    }
  }

}
</script>
<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

 

 

|Pass Props & Emit Events

 

|Props — ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ฆฌ๊ธฐ

  • props๋Š” ๋ถ€๋ชจ(์ƒ์œ„) ์ปดํฌ๋„ŒํŠธ์˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ํŠน์„ฑ
  • ์ž์‹(ํ•˜์œ„) ์ปดํฌ๋„ŒํŠธ๋Š” props ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์‹ ํ•˜๋Š” props๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•จ
  • ์ฆ‰, ๋ฐ์ดํ„ฐ๋Š” props ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋จ
  • ์ฃผ์˜
    • ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์—๋Š” ์ž์ฒด ๊ฒฉ๋ฆฌ๋œ ๋ฒ”์œ„๊ฐ€ ์žˆ์Œ
    • ์ฆ‰, ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ํ…œํ”Œ๋ฆฟ์—์„œ ์ƒ์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์—†์Œ
    •  

 

 

 

|Static Props ์ž‘์„ฑ

  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ(About.vue)์— ๋ณด๋‚ผ prop ๋ฐ์ดํ„ฐ ์„ ์–ธ
  • ์ž‘์„ฑ๋ฒ•
    • prop-data-name=“value”
    • key = “value”๋กœ ์ž์‹์—๊ฒŒ ๋„˜๊ธด๋‹ค!
  • ์ˆ˜์‹  ํ•  prop ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ ํ›„ ์‚ฌ์šฉ!

 

 

|Dynamic Props ์ž‘์„ฑ

  • v-bind directive๋ฅผ ์‚ฌ์šฉํ•ด ๋ถ€๋ชจ์˜ ๋ฐ์ดํ„ฐ์˜ props๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ
  • ๋ถ€๋ชจ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์ž์‹ ๋ฐ์ดํ„ฐ๋กœ๋„ ์ „๋‹ฌ ๋จ

  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ˆ˜์‹  ํ•  prop ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ ํ›„ ์‚ฌ์šฉ

|Props ์ด๋ฆ„ ์ปจ๋ฒค์…˜

  • during declaration (์„ ์–ธ ์‹œ)
    • camelCase
<script>
//1.๋ถˆ๋Ÿฌ์˜ค๊ธฐ(import)
import TheAbout from './components/TheAbout.vue'

export default {
  name: 'App',
  //2.๋“ฑ๋กํ•˜๊ธฐ(register)
  components: {
    TheAbout,
  },
  data: function() {
    return {
      parentData: 'this is parent data to child comp'

    }
  },
}
</script>
  • in template (HTML)
    • kebab-case
template์—์„œ ๋‘˜ ๋‹ค ๊ฐ€๋Šฅ...!
<!-- ์นด๋ฉœ ์ผ€์ด์Šค -->
<TheAbout :my-message="parentData" />
<!-- ์ผ€๋ฐฅ ์ผ€์ด์Šค -->
<the-about :my-message="parentData" @child-input-change="parentGetChange"></the-about>

 

 

 

 

|์ปดํฌ๋„ŒํŠธ์˜ ‘data’๋Š” ๋ฐ˜๋“œ์‹œ ํ•จ์ˆ˜์—ฌ์•ผ ํ•จ!!!!!!

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ์ธ์Šคํ„ด์Šค๋Š” ๋ชจ๋‘ ๊ฐ™์€ data ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ์ƒˆ๋กœ์šด data ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜(return)ํ•˜์—ฌ์•ผ ํ•จ
data: function(){
	return {
		myData: null,
	}
},

 

 

 

|Props์‹œ ์ž์ฃผํ•˜๋Š” ์‹ค์ˆ˜

  • Static ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆซ์ž๋ฅผ ์ „๋‹ฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒƒ
  • ์‹ค์ œ JavaScript ์ˆซ์ž๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด ๊ฐ’์ด JavaScript ํ‘œํ˜„์‹์œผ๋กœ ํ‰๊ฐ€๋˜๋„๋ก v-bind๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ

 

 

|๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • ๋ชจ๋“  props๋Š” ํ•˜์œ„ ์†์„ฑ๊ณผ ์ƒ์œ„ ์†์„ฑ ์‚ฌ์ด์˜ ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ํ˜•์„ฑ
  • ๋ถ€๋ชจ์˜ ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ž์‹ ์†์„ฑ์—๊ฒŒ ์ „๋‹ฌ๋˜์ง€๋งŒ, ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ๋Š” ์•ˆ ๋จ
    • ํ•˜๊ธ‰์ž-(์‹œ๊ทธ๋„๋ณด๋‚ด)->์ƒ๊ธ‰์ž
  • ์ž์‹ ์š”์†Œ๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๋ถ€๋ชจ ์š”์†Œ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์•ฑ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์ผ์„ ๋ฐฉ์ง€
  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์ž์‹ ์š”์†Œ์˜ ๋ชจ๋“  prop๋“ค์ด ์ตœ์‹  ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ

 

 

|Emit event

Emit : ๋ฐœ์‹ ํ•˜๋‹ค, ๋ฐœ์ƒํ•˜๋‹ค

  • “Listening to Child Components Events”
  • $emit(eventName)
    • ํ˜„์žฌ ์ธ์Šคํ„ด์Šค์—์„œ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ
    • ์ถ”๊ฐ€ ์ธ์ž๋Š” ๋ฆฌ์Šค๋„ˆ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ
  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ํ…œํ”Œ๋ฆฟ์—์„œ v-on์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณด๋‚ธ ์ด๋ฒคํŠธ๋ฅผ ์ฒญ์ทจ (v-on์„ ์ด์šฉํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ์ด๋ฒคํŠธ)

 

 

|Emit event ์ž‘์„ฑํ•˜๊ธฐ

  • ํ˜„์žฌ ์ธ์Šคํ„ด์Šค์—์„œ $emit ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด child-input-change ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ

  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ(App.vue)๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ(About.vue)๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ํ…œํ”Œ๋ฆฟ์—์„œ v-on directive๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณด๋‚ธ ์ด๋ฒคํŠธ (child-input-change)๋ฅผ ์ฒญ์ทจ

|event ์ด๋ฆ„ ์ปจ๋ฒค์…˜

  • ์ปดํฌ๋„ŒํŠธ ๋ฐ props์™€๋Š” ๋‹ฌ๋ฆฌ, ์ด๋ฒคํŠธ๋Š” ์ž๋™ ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ
  • HTML์˜ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์„ ์œ„ํ•ด DOM ํ…œํ”Œ๋ฆฟ์˜ v-on ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ํ•ญ์ƒ ์ž๋™์œผ๋กœ ์†Œ๋ฌธ์ž ๋ณ€ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— v-on:myEvent๋Š” ์ž๋™์œผ๋กœ v-on:myevent๋กœ ๋ณ€ํ™˜
  • ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ด๋ฒคํŠธ ์ด๋ฆ„์—๋Š” ํ•ญ์ƒ kebab-case๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

'Development > Vue.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Vue.js - Youtube API๋ฅผ ์ด์šฉํ•ด props์™€ emit ํ™œ์šฉํ•˜๊ธฐ  (0) 2022.05.11
Vue.js - Vue Router  (0) 2022.05.09
Vue.js - Babel & Webpack  (0) 2022.05.09
Vue.js - Vue CLI  (0) 2022.05.09
Vue.js - SFC(Single File Component)  (0) 2022.05.09

๋Œ“๊ธ€