저번 시간에 <Modal/> 컴포넌트를 만들어봤는데, 모달창이 제대로 뜨지 않았습니다.
문제는 데이터 바인딩에 있습니다.
Modal.vue 코드에서는 아래와 같이
<div class="black-bg" v-if="모달창열렸니 == true">
<div class="white-bg">
<img :src="원룸들[누른거].image" style="width:100%">
<h4>{{ 원룸들[누른거].title }}</h4>
<!-- (생략) -->
</div>
</div>
와 같이 원룸들, 누른거 등의 변수를 사용하고 있는데,
Modal.vue 내부에 해당 데이터가 없어서 바인딩에 문제가 생긴 것입니다.
(데이터 바인딩을 하려면 해당 데이터가 컴포넌트 내부에 존재해야 합니다.)
따라서 옳은 방법은 App.vue에 저장된 원룸들 데이터를 props를 통해 전달하는 것입니다.

부모 컴포넌트(App.vue)에서 자식 컴포넌트(Modal.vue)로 데이터를 전달하려면 아래 3단계를 따릅니다.
용어 정리:
- App.vue는 상위(부모) 컴포넌트
- Modal.vue는 하위(자식) 컴포넌트
자식이 부모의 데이터를 사용하려면 props를 통해 전송받아야 합니다.
부모에서는 아래와 같이 props로 데이터를 전달합니다.
<!-- App.vue -->
<template>
<!-- 원룸들 데이터가 Modal.vue로 전달됩니다. -->
<Modal :원룸들="원룸들" />
</template>
<script setup>
import { ref } from 'vue'
import Modal from './Modal.vue'
// 원룸들 데이터는 배열 형태로 관리 (예시)
const 원룸들 = ref([
{ image: 'image1.jpg', title: '원룸 A' },
{ image: 'image2.jpg', title: '원룸 B' },
// 기타 데이터...
])
</script>
참고: :원룸들="원룸들" 문법은 데이터 바인딩과 props 전송 두 가지 역할을 합니다.
(이처럼 이름을 동일하게 쓰면 간편합니다.)
<!-- Modal.vue -->
<template>
<div class="black-bg" v-if="모달창열렸니">
<div class="white-bg">
<img :src="원룸들[누른거].image" style="width:100%" />
<h4>{{ 원룸들[누른거].title }}</h4>
<!-- (생략) -->
</div>
</div>
</template>
<script setup>
// 부모로부터 전달받은 원룸들 데이터를 등록합니다.
const props = defineProps({
원룸들: {
type: Array,
required: true // 필수 여부
}
})
// 만약 Modal.vue 내부에서 사용하는 다른 상태(예: 모달창열렸니, 누른거)도 있다면
// 아래와 같이 별도로 관리합니다.
// 예시:
// import { ref } from 'vue'
// const 모달창열렸니 = ref(true)
// const 누른거 = ref(0)
</script>
중요:
- 등록된 props는 템플릿에서 자유롭게 읽기 전용으로 사용할 수 있습니다.
- props 데이터를 수정하려고 하면 Vue에서는 에러가 발생합니다.
(수정이 필요하면 부모에서 데이터 변경을 해야 하거나, 자식 컴포넌트 내에서 별도의 반응형 변수로 복사 후 사용합니다.)
props.원룸들을 사용하여,<img :src="원룸들[누른거].image"> 와 같이 자유롭게 데이터 바인딩이 가능합니다.모달창열렸니, 누른거)도 동일하게 사용할 수 있습니다.<script setup> 내부에 data()를 사용해 직접 저장해도 되지만...