부모는 자식에게 데이터를 전달(Pass Props)하며, 자식은 자신에게
일어난 일
을 부모에게알림
(Emit event) - 직접적으로 전달하는 것은 아님!
하향식 단방향 바인딩
을 형성(one-way-down binding)변경하려고 시도해서는 안되며
불가능단방향인 이유
사전준비
- vue 프로젝트 생성
- 초기 생성된 컴포넌트 모두 삭제(App.vue제외)
- src/assets 내부 파일 모두 삭제
- main.js 해당 코드 삭제
import './assets/main.css' // 삭제
1. App 컴포넌트 작성 |
---|
2. Parent 컴포넌트 작성 |
---|
<template>
<div>
</div>
</template>
<script setup>
</script>
<style scoped>
</style>
부모 컴포넌트 Parent에서 자식 컴포넌트 ParentChild에 보낼 props 작성
템플릿에서 반응형 변수와 같은 방식으로 활용
props를 객체로 반환하므로 필요한 경우 JavaScript 에서 접근 가능
<template>
<div>
{{ myMsg }}
<ParentGrandChild my-msg="message" />
</div>
</template>
<script setup>
import ParentGrandChild from '@/components/ParentGrandChild.vue'
</script>
ParentChild 컴포넌트에서 Parent로부터 받은 prop인 myMsg를 ParentGrnadChild에게 전달 |
---|
<template>
<div>
<p> {{ myMsg }}</p>
</div>
</template>
<script setup>
defineProps({
myMsg: String,
})
</script>
<style scoped>
</style>
자식 컴포넌트로 전달 시 => kebab-case |
---|
|
-> 기술적으로 camelCase도 가능하나 HTML 속성 표기법과 동일하게 kebab-case로 표기할 것을 권장
Dynamic props 정의
Dynamic props 선언 및 출력
💡 부모는 자식에게 데이터를 전달(Pass Props)하며, 자식은 자신에게 일어난 일을 부모에게 알림(Emit event)
부모가 prop 데이터를 변경하도록 소리쳐야 한다
$
표기는 Vue 인스턴스나 컴포넌트 내에서 제공되는 전역 속성이나 메서드를 식별하기 위한 접두어이름
-> 부모가 캐치추가 인자
<button @click=$emit('someEvent')"> 클릭 </button>
<ParentComp @some-event="someCallback" />
<button @click="$emit('someEvent')">클릭</button>
v-on
을 사용하여 발신된 이벤트를 수신<script setup>
const emit = defineEmits(['someEvent', 'myFocus'])
const buttonClick = function () {
emit('someEvent')
}
</script>
이벤트 선언 방식으로 추가 버튼 작성 및 결과 확인
<!-- ParentChild.vue -->
<script setup>
const emit = defineEmits(['someEvent'])
const buttonClick = function () {
emit('someEvent')
}
</script>
<button @click="buttonClick">클릭</button>
ParentChild에서 이벤트를 발신하여 Parent로 추가 인자 전달하기
<!-- ParentChild.vue -->
const emit = defineEmits(['someEvent', 'emitArgs'])
const emitArgs= function () {
emit('emitArgs',1,2,3)
}
<button @click="emitArgs">추가 인자 전달</button>
ParentChild에서 발신한 이벤트를 Parent에서 수신
<!-- Parent.vue -->
<ParentChild
@some-event="someCallback"
@emit-args="getNumbers"
my-msg="message"
:dynamic-props="name"
/>
const getNumbers=function (...args) {
console.log(args)
console.log(`ParentChild가 전달한 추가인자 ${args}를 수신했어요`)
}
선언 및 발신 시 ( -> camelCase)
부모 컴포넌트로 수신 시 ( -> kebab-case)
최하단 컴포넌트 ParentGrandChild에서 Parent 컴포넌트의 name 변수 변경 요청하기
const updateName = function() {
name.value = 'Bella'
}
- 첫 번째는 정적 props로 문자열로써의 "1"을 전달
- 두 번째는 동적 props로 숫자로써의 1을 전달