Vue app은 자연스롭게 중첩된 컴포넌트 트리로 구성됨
컴포넌트간 부모-자식 관계가 구성되며 이들 사이에 필연적으로 의사소통이 필요함
부모는 자식에게 데이터를 전달(Pass Props)하며, 자식은 자신에게 일어난 일을 부모에게 알림(Emit event)
"Props는 아래로, event는 위로"
부모는 props를 통해 자식에게 '데이터'를 전달하고, 자식은 events를 통해 부모에게 '메시지'를 보냄
//App.vue
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<about my-message="This is prop data"</about>
</div>
</template>
// About.vue
<template>
<div>
<h1>About</h1>
<h2>{{myMessage}}</h2>
</div>
</template>
<script>
export default{
name:"About",
props:{
myMessage: String,
}
}
</script>
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<the-about
my_message="This is prop data"
:parent-data="parrentData"
>
</the-about>
</div>
</template>
<script>
// 1. 불러오기
import TheAbout from './components/TheAbout.vue'
export default {
name: 'App',
// 2. 등록하기
components: {
TheAbout,
},
data: function(){
return{
parrentData : 'This is parent data by v-bind'
}
},
}
</script>
<template>
<div>
<h1>{{myMessage}}</h1>
<h2>{{parentdata}} </h2>
</div>
</template>
<script>
export default {
name : 'TheAbout',
props:{
myMessage:String,
parentData :String
},
}
</script>
data : function() {
return {
myData: null,
}
}
<!-- 이것은 일반 문자열 "1"을 전달합니다. -->
<comp some-prop="1"></comp>
<!-- 이것은 실제 숫자로 전달합니다. -->
<comp :some-prop="1"></comp>
<template>
<div>
<h1>{{myMessage}}</h1>
<h2>{{parentData}}</h2>
<input type="text"
v-model="childInputData"
@keyup.enter="childInputChange"
>
</div>
</template>
<script>
export default {
name : 'TheAbout',
props:{
myMessage:String,
parrentData :String,
},
data: function(){
return{
childInputData:''
}
},
methods :{
childInputChange: function() {
console.log('야!!',this.childInputData)
// 부모 컴포넌트에게 1번인자라는 이름의 이벤트를 발생 + 2번 인자 데이터를 보냄
this.$emit('child-input-change',this.childInputData)
}
},
}
</script>
<style>
</style>
this.$emit('myEvnet')
<!-- 이벤트가 동작하지 않음 -->
<my-component @my-event="doSomething"></my-component>