props
๋ฅผ ํ์ฉํ์ฌ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์์ ์ปดํฌ๋ํธ์์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ๋๋ ํธ๋ฆฌ๊ฑฐ์ ๋ชฉ์ ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ํฌ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ๋ ์ปดํฌ๋ํธ์emit
๋ฉ์๋๋ฅผ ํตํ์ฌ ๋ฐ์ ์ํฌ ์ ์๋ค.
์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ ๋ props๋ก ์ ๋ฌ์ด ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฆด ๋๋ emit์ ํ์ฉํ์ฌ ์ฌ๋ฆด ์ ์๋ค.
ํ
ํ๋ฆฟ ์์์ ์ฌ์ฉํ ๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ๋ฉ์๋์ธ $emit
์ ์ฌ์ฉํ์๊ณ
<template>
<button @click="$emit('someEvent')">๋ฒํผ</button>
</template>
๊ทธ๋ฌ๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ v-on
(๋๋ @
)์ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์๋ค.
<MyComponent @some-event="callFunction">
.once
์์์ด๋ ์ปดํฌ๋ํธ ์ปค์คํ
์ด๋ฒคํธ์์๋ ์ง์๋ฉ๋๋ค.
<MyComponent @some-event.once="callFunction">
์ด๋ฒคํธ์ ํจ๊ป ํน์ ๊ฐ์ ๋ด๋ณด๋ผ ์ ์๋ค. $emit
ํจ์ ์ด๋ฒคํธ๋ช
์ ์ถ๊ฐ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ธธ ์ ์๋ค.
<template>
<button @click="$emit('someEvent', 'Hello', 'Hi', '~')">๋ฒํผ</button>
</template>
๊ทธ๋ฐ๋ค์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ด๋ฒคํธ์ ํจ๊ป ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์ ์๋ค.
<template>
<MyComponent @some-event="callFunction" />
</template>
<script setup>
export default{
setup(){
const callFunction = (word1, word2, word3) => {
alert(word1, word2, word3);
};
return {
callFinction
}
}
}
</script>
emits
์ต์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ๋ฅผ ์ ์ธํ ์ ์๋ค. ์ด๋ ์ด๋ฒคํธ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง ํ์์ผ๋ก ์ ์ธํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ JavaScript ์ฝ๋์์ ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ผ ๋๋ setup()
ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ context.emit()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
<script>
export default{
emits: ['someEvent'],
setup(props, context){
context.emit('someEvent', 'Hello World!')
}
}
</script>
<script>
export default{
emits: ['someEvent'],
setup(props, { emit }){
emit('someEvent', 'Hello World!')
}
}
</script>
validation
๋ก์ง์ ์ถ๊ฐํ ์ ์๋ค. ๋ง์ฝ validation
์ด ์๋ค๋ฉด null
๋ก ์ค์ ํ๋ฉด ๋๋ค.<script>
export default{
emits: {
//์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์๋ ์ด๋ฒคํธ ์ ์ธ
someEvent: null,
//์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ์๋ ์ด๋ฒคํธ ์ ์ธ
someSubmit: (result) => {
if (email && password) {
return true
} else {
console.warn('result ๊ฐ์ด ๋น์ด์์ต๋๋ค!')
return false
}
}
},
setup(props, context){
context.emit('someEvent', 'Hello World!')
}
}
</script>
์ ํ ์ฌํญ์ด์ง๋ง ์ปดํฌ๋ํธ๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ ์ ๋ฌธ์ํํ๊ธฐ ์ํด ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ์ข๋ค. ๋ํ Vue๊ฐ fallthrough์์ฑ์์ ์๋ ค์ง ๋ฆฌ์ค๋๋ฅผ ์ ์ธํ ์ ์๋ค.
์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ํ ํด๋น ์ปดํฌ๋ํธ์
v-model
์ ์ ์ฉํ๋ ค๋ฉด@update:modelValue
์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌv-model
์ ๋ง๋ค ์ ์๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ HTML ์์์ธ<input>
ํ๊ทธ์v-model
์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
<input v-model="username">
์์ ์ ์ธ๋ v-model
์ ์๋์ ๊ฐ์ด ๋์ํ๋ค.
<input :value="username" @input="username = $event.target.value">
์์ ๊ธฐ๋ณธ ๋์ ๋์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ปดํฌ๋ํธ๋ ์๋์ ๊ฐ์ด ์ํํ๋ค.
<LabelInput :modelValue="username" @update:modelValue="newValue => username = newValue">
<!-- props๋ก๋ :modelValue ์ด๋ฒคํธ๋ก๋ @update:modelValue๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค.-->
์ด <LabelInput>
์ ์ค์ ๋ก ๋์ํ๊ฒ ํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ์ปดํฌ๋ํธ๋ฅผ ์ ์ํด์ผํ๋ค.
modelValue
props
๋ฅผ :value
์์ฑ์ ๋ฐ์ธ๋ฉ@input
์ด๋ฒคํธ์์ ์ @update:modelValue
์ด๋ฒคํธ๋ก ๋ด๋ณด๋ธ๋ค.<template>
<label>
{{ label }}
<input type="text" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">
</label>
</template>
<script>
export default{
props: ['modelValue', 'label'],
emits: ['update:modelValue'],
};
</script>
๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ปดํฌ๋ํธ์ v-model
์ ์ ์ฉํ ์ ์๋ค.
<LabelInput label="์ด๋ฆ" v-model="username">
<template>
<label>
{{ label }}
<input type="text" :value="value">
</label>
</template>
<script>
import { computed } from 'vue';
export default{
props: ['modelValue', 'label'],
emits: ['update:modelValue'],
setup(props, context){
const value = computed({
get() {
return props.modelValue;
},
set() {
contex.emit('update:modelValue', value);
},
});
return { value };
}
};
</script>
์ ๋ฌ ํ ์ ์๋ค. ์ด๋ด๋ emit
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
v-model
์ ์ปดํฌ๋ํธ์์ modelValue
props
์ update:modelValue
์ด๋ฒคํธ๋ก ์ฌ์ฉํ๋ค. ํ์ง๋ง ์ ๋ฌ์ธ์(Arguments)
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ด๋ฆ์ ์์ ํ ์ ์๋ค.<BookComponent v-model:title="bookTitle">
์ด ๊ฒฝ์ฐ ์์ ์ปดํฌ๋ํธ์์๋ :title
์ ์์ฑ์ผ๋ก ์ ์ํ๊ณ update:title
๋ก ์ด๋ฒคํธ๋ฅผ ๋ด๋ณด๋ด์ผ ํ๋ค.
<template>
<article>
<strong>์ฑ
์ด๋ฆ</strong> :
<input type="text" :value="title" @input="$emit('update:title', $event.target.calue)" >
</article>
</template>
<script>
export default {
props: ['title'],
emits: ['update: title'],
}
</script>