๐Pass Props & Emit Events
|์ปดํฌ๋ํธ ์์ฑ
- Vue app์ ์์ฐ์ค๋ฝ๊ฒ ์ค์ฒฉ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ก ๊ตฌ์ฑ
- ์ปดํฌ๋ํธ๊ฐ ๋ถ๋ชจ-์์ ๊ด๊ณ๊ฐ ๊ตฌ์ฑ๋๋ฉฐ ์ด๋ค ์ฌ์ด์ ํ์ฐ์ ์ผ๋ก ์์ฌ ์ํต์ด ํ์ํจ
- ๋ถ๋ชจ๋ ์์์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ**(Pass props)ํ๋ฉฐ, ์์์ ์์ ์๊ฒ ์ผ์ด๋ ์ผ์ ๋ถ๋ชจ์๊ฒ ์๋ฆผ(Emit event)**
- ๋ถ๋ชจ์ ์์์ด ๋ช ํํ๊ฒ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ฒฉ๋ฆฌ๋ ์ํ๋ฅผ ์ ์งํ ์ ์์
- “props๋ ์๋๋ก, events๋ ์๋ก”
- ๋ถ๋ชจ๋ props๋ฅผ ํตํด ์์์๊ฒ ‘๋ฐ์ดํฐ’๋ฅผ ์ ๋ฌํ๊ณ , ์์์ events๋ฅผ ํตํด ๋ถ๋ชจ์๊ฒ ‘๋ฉ์์ง’๋ฅผ ๋ณด๋
|์ปดํฌ๋ํธ ๊ตฌ์กฐ
- ํ ํ๋ฆฟ (HTML)
- ์คํฌ๋ฆฝํธ (JavaScript)
- ์คํ์ผ (CSS)
|ํ ํ๋ฆฟ(HTML)
- HTML์ body ๋ถ๋ถ
- ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์์ฑ
- ๋งํฌ์ ์์ฑ ๋ถ๋ถ
|์คํฌ๋ฆฝํธ(JavaScript)
- JavaScript๊ฐ ์์ฑ๋๋ ๊ณณ
- ์ปดํฌ๋ํธ ์ ๋ณด, ๋ฐ์ดํฐ, ๋ฉ์๋ ๋ฑ vue ์ธ์คํด์ค๋ฅผ ๊ตฌ์ฑํ๋ ๋๋ถ๋ถ์ด ์์ฑ ๋จ
|์คํ์ผ(CSS)
- CSS๊ฐ ์์ฑ๋๋ฉฐ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ด๋น
|์ปดํฌ๋ํธ ๋ฑ๋ก 3๋จ๊ณ
- ๋ถ๋ฌ์ค๊ธฐ (import)
- ๋ฑ๋กํ๊ธฐ (register)
- ๋ณด์ฌ์ฃผ๊ธฐ (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 |
๋๊ธ