
$emit(이벤트명, 전달할자료) 를 사용하여 부모에게 커스텀 이벤트 전송<!-- Card.vue (자식 컴포넌트) -->
<template>
<div>
<img :src="a.image" class="room-img" />
<!-- 클릭 시 부모에게 'openModal' 이벤트를 전달 -->
<h4 @click="$emit('openModal', a.id)"> {{ a.title }} </h4>
<p>{{ a.price }} 원</p>
</div>
</template>
<script setup>
// Vue3 <script setup> 문법 사용
// 부모로부터 'a'라는 prop 받음
const props = defineProps({
a: Object
});
// 부모에게 전달할 이벤트명 'openModal'를 명시
const emit = defineEmits(['openModal']);
</script>
<!-- App.vue (부모 컴포넌트) -->
<template>
<!-- Card 컴포넌트에서 'openModal' 이벤트 수신 -->
<Card @openModal="handleOpenModal" :a="item" />
<!-- 모달창이 열려야 하는 조건에 따라 모달 컴포넌트 렌더링 등 -->
<Modal v-if="modalOpen" :clickedId="clickedId" />
</template>
<script setup>
import { ref } from 'vue';
import Card from './Card.vue';
import Modal from './Modal.vue';
// 모달창 열림 여부와 클릭한 상품의 id를 상태로 관리
const modalOpen = ref(false);
const clickedId = ref(null);
// 자식에서 보낸 커스텀 이벤트를 수신하여 처리하는 함수
function handleOpenModal(payload) {
modalOpen.value = true; // 모달창 열기
clickedId.value = payload; // 전달받은 상품 id 저장
}
// 예시로 부모에서 사용할 데이터 (실제 상황에 맞게 구성)
const item = {
id: 0,
image: 'https://example.com/image.jpg',
title: '상품 제목',
price: 10000
};
</script>
defineEmits(['이벤트명']) 후 $emit('이벤트명', 자료) 사용<자식컴포넌트 @이벤트명="수신시 실행할 코드" />로 처리this.$emit() 사용했으나, Vue3 <script setup>에서는 위와 같이 간단히 작성 가능)모달창열렸니)는 부모(App.vue)가 가지고 있음.$emit('openModal', a.id) 로 부모에게 요청<Card @openModal="handleOpenModal" />로 이벤트 수신, 받은 payload로 모달창열렸니 = true 및 클릭한 상품 id 저장