๋์ ๋จธ๋ฆฌ๋ก ์์์ ธ ๋ค์ด์ค๋ ์ง์์ ํ์ ์์์ ํ๋ฃจํ๋ฃจ๋ฅผ ๋ณด๋ด๊ณ ์๋ค.
์ค๋์ Vue.js ์ปดํฌ๋ํธ์์ ์ค์ํ ๊ฐ๋
์ธ props์ $emit์ ๋ฐฐ์ ๋ค.
์์ ๋ฅผ ํตํด ํ์คํ ์ดํดํ๊ณ ๋์ด๊ฐ๋ณด์.
์ปดํฌ๋ํธ ๊ธฐ์ด
1. ์ปดํฌ๋ํธ ๊ตฌ์ฑํ๊ธฐ
2. ์์ ์ปดํฌ๋ํธ์๊ฒ ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ - props
3. ํ์ ์ปดํฌ๋ํธ ์ด๋ฒคํธ ์์ - emit
์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฐ๊ฐ์ ๋
๋ฆฝ๋ ๋ชจ๋์ ์๋ฏธํ๋ค.
์น ํ์ด์ง๋ฅผ ์๋ฅผ ๋ค์๋ฉด, ํค๋, ์ฌ์ด๋๋ฐ, ์ปจํ
์ธ ๋ฑ์ด ์์ ์ ์๋ค.
์์ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ปดํฌ๋ํธ ๋ฑ๋ก
๊ณผ์ ์ด ํ์ํ๋ค.
vue์์๋ ์ ์ญ(global) ๋ฑ๋ก
๊ณผ ์ง์ญ(local) ๋ฑ๋ก
2๊ฐ์ง ๋ฐฉ์์ ์ด์ฉํ ์ ์๋ค.
// main.js
import { createApp } from 'vue'
import App from '~/App'
import Hello from '~/components/Hello'
const app = createApp(App)
app.component('Hello', Hello)
app.mount('#app')
์์ ๊ฐ์ด Hello ๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ app์ ์ ์ญ ๋ฑ๋กํ์ฌ app ํ ํ๋ฆฟ์ ์ฌ์ฉํ ์ ์๋ค.
// App.vue
import Hello from '~/components/Hello'
export default {
components: {
Hello
},
}
์์ ๊ฐ์ด Hello ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ App ์ปดํฌ๋ํธ์ ์ง์ญ ๋ฑ๋กํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
// Hello.vue
<template>
<div>
{{ hello }}
</div>
</template>
// hello๋ผ๋ ์ด๋ฆ์ผ๋ก ์ธ๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ฒ ๋ค
export default {
props: ['hello']
}
Hello๋ผ๋ App์ ์์ ์ปดํฌ๋ํธ์์ App์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๊ณ ์ถ๋ค๋ฉด,
์์ ๊ฐ์ด props๋ฅผ ํ์ฉํ ์ ์๋ค.
// App.vue
<template>
<Hello
v-for="fruit in fruits"
:key="fruit.id"
:hello="fruit.name"
/>
</template>
<script>
import Hello from '~/components/Hello'
export default {
components: {
Hello
},
data(){
return {
fruits: [
{id: 1, name: 'apple'},
{id: 2, name: 'banana'},
{id: 3, name: 'cherry'}
]
}
}
}
App ์ปดํฌ๋ํธ์์๋ hello์ ์ ๋ฌํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ v-bind๋ฅผ ํ์ฉํด ์์ ๊ฐ์ด ์ ๋ฌํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ๋ง์ฝ ์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด?
์ด๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ๋ฐ๋ก emit์ด๋ค.
// Hello.vue
<template>
<div>
{{ hello }}
</div>
<button @click="capitalize">
Click me!
</button>
</template>
<script>
export default {
props: ['hello'],
emits: ['to-upper'],
methods: {
capitalize(){
// emit์ ์ด์ฉํด to-upper๋ผ๋ ์ปค์คํ
์ด๋ฒคํธ ์์ฑ
// ์ด๋ฒคํธ ๋ฐ์ ์ ๋๋ฌธ์๋ก ๋ณ๊ฒฝ๋ hello ๋ฐ์ดํฐ ์ ๋ฌ
this.$emit('to-upper', this.hello.toUpperCase())
}
}
}
Hello ์ปดํฌ๋ํธ์ ๋ฒํผ ํด๋ฆญ ์ ์คํ ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ค๋ค.
capitalize ๋ฉ์๋๋ emit์ ์ด์ฉํด to-upper๋ผ๋ ์ปค์คํ
์ด๋ฒคํธ ์์ฑํ๋ฉฐ, ์ด๋ฒคํธ ๋ฐ์ ์ ๋๋ฌธ์๋ก ๋ณ๊ฒฝ๋ hello ๋ฐ์ดํฐ๊ฐ ํจ๊ป ์ ๋ฌ๋๋ค.
// App.vue
<template>
<Hello
v-for="fruit in fruits"
:key="fruit.id"
:hello="fruit.name"
@to-upper="toUpper(fruit, $event)" />
</template>
<script>
import Hello from '~/components/Hello'
export default {
components: {
Hello
},
data(){
return {
fruits: [
{id: 1, name: 'apple'},
{id: 2, name: 'banana'},
{id: 3, name: 'cherry'}
]
}
},
methods: {
toUpper(fruit, upperName){
fruit.name = upperName
}
}
}
</script>
App ์ปดํฌ๋ํธ์์๋ to-upper ์ด๋ฒคํธ ๋ฐ์ ์ toUpper ๋ฉ์๋๋ฅผ ์คํํ๋ค.
toUpper ๋ฉ์๋๋ Hello ์ปดํฌ๋ํธ์ ์ปค์คํ
์ด๋ฒคํธ ์คํ ์ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ $event๋ก ๋ฐ์ ์ ์๋ค.
๋ฐ๋ผ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด fruit.name ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
vue๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ํ๋ ์์ํฌ์ ์ค์์ฑ์ ์ ๋๋ก ๋๋ผ๊ณ ์๋ค.
๋ฐ๋๋ผ js๋ก ๊ตฌํํ๋ ๋ถ๋ถ๋ค์ด ํ์คํ ๊ฐํธํ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
์์ง vue๊ฐ ์ต์์น์์ ์ ์ฉํ๋๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ธดํ์ง๋ง, ์์ ๋ฅผ ํ๋ํ๋ ํผ์ ํ์ผ๋ก ํด๊ฒฐํด๋ณด๋ฉฐ ์ต์ํด์ ธ์ผ๊ฒ ๋ค.
๋ค์ฌ ์์ผ ๊ท์ฝ๋ ใ ใ ใ ใ ใ ใ ๋ ์ ๋ฆฌ ๋๋ชจ ์ํด์ ์ฌ๋๋ค ๋๊บผ ๋ณด๊ณ ๋์ ๋ง์ด ๋ ๋ฏ