일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 티스토리챌린지
- 정처기 필기 벼락치기
- 자바 소인수분해
- 스프링 부트 프로젝트 세팅
- 배열 순환 문제 공식
- string과 stringbuilder 성능 차이
- 숨어있는 숫자의 덧셈 (1) 자바
- 자바 팩토리얼
- 오블완
- 프로그래머스 공 던지기 게임
- 프로그래머스
- 정보처리기사 필기 벼락치기
- 자바 합성수 찾기
- 경우의 수 자바
- 스프링부트 의존성 설정
- string과 stringbuilder 성능 최적화
- 배열 순환 자바
- 왓챠피디아 클론 코딩
- stringbuilder란
- 펙토리얼
- 비전공자 정보처리기사 필기
- 정보처리기사 필기
- 소인수분해 구하는 공식
- 스프링 부트 배너 설정
- 접속 url 출력
- 비전공자 정처기 필기
- spring boot 배너 설정
- 피그마 썸네일
- 프로그래머스 문자열 정렬하기(1)
- 배열 순환
- Today
- Total
여름 언덕에서 배운 것
props 본문
코딩애플 온라인 강좌 - 개발자도 단기완성!
단연 NO1 강사님의 NO.1 강의 역시나 명강입니다. IT 업계의 대치동 NO1. 강사같은 엄청난 강의력. 코딩애플님의 강의는, 엄청나게 기초적인 것부터 가르치는 듯 보이지만, 실제로 다루는 깊이는 절
codingapple.com
부모가 가진 데이터를 자식이쓰고 싶으면 props로 전해주셈
저번 시간에 <Modal/> 컴포넌트를 만들어봤는데 모달창이 잘 안뜹니다.
데이터바인딩에 문제가 생겨서 그렇습니다.
모달창 만들어둔 Modal.vue 코드를 보시면..
<div class="black-bg" v-if="모달창열렸니 == true">
<div class="white-bg">
<img :src="원룸들[누른거].image" style="width:100%">
<h4>{{ 원룸들[누른거].title }}</h4>
(생략)
대충 원룸들, 누른거 이런 변수를 데이터바인딩 잔뜩해놨는데
원룸들이라는 데이터가 Modal.vue안에 없어서 문제가 생긴겁니다.
(데이터바인딩 하려면 데이터가 밑에 있어야합니다)
그럼 어떻게합니까. 원룸들이라는 데이터를( APP.vue - 부모) Modal.vue 파일에도 복사 붙여넣기 해주면 되나요?
그건 안됩니다. 데이터를 사본을 만들기 시작하면 그 데이터가 업데이트사항이 생겼을 때 복사본들에 어떻게 전부 반영시킬겁니까.
미래를 생각해봤을 때 그건 하면 안될 짓입니다.
옳은 방법은 App.vue에 있던 원룸들이라고 저장해둔 데이터를 전송해서 쓰는 것입니다.
하위컴포넌트로 데이터를 전송하려면 props라는 문법으로 Modal.vue에 보내면 됩니다.
props 보내는 것도 3-step이 있습니다.
1. 보내고 2. 등록하고 3. 써야합니다.
잠깐 용어정리를 하자면
App.vue 안에 Modal.vue를 집어넣어서 쓰고 있습니다.
이 경우 Modal은 하위 또는 자식 컴포넌트
App은 상위 또는 부모 컴포넌트라고 비유해서 부릅니다.
자식이 부모가 가진 데이터 쓰려면 props
부모 -> 자식 이렇게 props라는 문법으로 전송해주어야 사용가능합니다.
props 쓰려면 이것도 3-step이 있습니다.
1. 보내고 2. 등록하고 3. 쓰면 됩니다. 3번은 생략해도 에러는 안남
원룸들이라는 App.vue에 있는 데이터를 Modal.vue로 보내봅시다.
(App.vue)
<Modal :원룸들="원룸들" />
① 이렇게 데이터바인딩 문법쓰시면 데이터를 <Modal>로 보낼 수 있습니다.
<Modal :작명="하단의데이터이름" /> 이런 식으로 써주면 됩니다. 근데 귀찮아서 이름 두개 통일함
(그래서 콜론 : 이거 역할은 2개입니다. 데이터바인딩 혹은 props 전송임)
(Modal.vue)
<script>
export default {
name : 'Modal',
props : {
원룸들 : Array,
}
}
</script>
② 자식컴포넌트는 데이터를 받으면 props로 등록하십시오.
props : {} 열고 거기다가 아까 작명한 { 데이터이름 : 자료형 }
적어주면 됩니다.
자료형엔 Array, Object, String, Number 이런 것들을 적으면 됩니다. 틀려도 됩니다.에러는 안뜨고
자료형 확인하려는 공간입니다.
③ props 등록한 것들은 HTML안에서 데이터바인딩으로 자유롭게 사용가능합니다.
그래서 원룸들, 누른거, 모달창열렸니 이런 데이터들을 App.vue에서 Modal.vue로 한번 보내보십시오.
잘 보냈으면 모달창이 동작할겁니다.
하지만 닫기버튼은 주석처리합시다. 아마 props 수정하지마세요~ 이런 에러가 뜰겁니다.
props는 그냥 받아서 사용만 하는 read-only 데이터처럼 취급하셔야지 수정하시면 안됩니다. 에러남
아래 등호처럼 재할당 하면 안됩니디!
Q. 애초에 Modal.vue에다가 원룸들, 누른거 이런거 데이터 저장해두면 안되나?
props가 귀찮기 때문에
App.vue에다가 만들지말고 애초에 Modal.vue 파일에다가 data(){} 열고
여기에 데이터들 저장해놓고 쓰면 안되냐는 소리입니다.
내가 이 데이터를 Modal.vue 안에서만 쓸 거라고 자신하면 거기다가 만드셔도 됩니다.
하지만 데이터를 만들 때 원칙이 있는데
"데이터를 사용하는 컴포넌트들 중 최상위 컴포넌트에다가 데이터를 만들어놔야함"
이걸 지켜서 만들어주시길 바랍니다.
왜냐면 데이터는 위로 전송하는게 복잡하고 추적이 어렵기 때문입니다.
귀찮으면 그냥 모조리 App.vue에 저장해놓으셈 그것도 나쁘지 않습니다.
오늘의 교훈 :
컴포넌트로 많이 쪼개면 props 보내는거 귀찮으니까
만들기 전에 "만들면 이득이 있을까" 라는 생각을 해보고 만들도록 합시다.
<template>
<div class="black-bg" v-if="모달창열렸니==true">
<div class="white-bg">
<img :src="원룸들[누른거].image" style="width:50%;" alt="">
<h4>{{원룸들[누른거].title}}</h4>
<p>{{원룸들[누른거].price }}</p>
<p>{{원룸들[누른거].content }}</p>
<!-- <button @click="모달창열렸니=false">닫기</button> -->
</div>
</div>
</template>
<script>
export default {
name: 'Modal',
props: {
원룸들: Array,
누른거: Number,
모달창열렸니:Boolean,
}
}
</script>
<style>
.black-bg{
width: 100%; height: 100%;
background: rgba(0,0,0,0.5);
position: fixed; padding : 20px;
}
.white-bg{
width: 100%; background: white;
border-radius: 8px;
padding: 20px;
}
</style>
🍎🍎🍎
카드 컴포넌트화 하기
<template>
<div v-for="(room,i) in 원룸들" :key="i">
<img :src="room.image" class="room-img" alt="">
<h4>{{room.title}}원룸</h4>
<p>{{room.price}}</p>
</div>
</template>
<script>
export default {
name: 'Card',
props: {
원룸들: Array,
누른거: Number,
모달창열렸니:Boolean,
}
}
</script>
<style>
.room-img{
width : 100%;
margin-top: 40px;
}
</style>
'가랑비에 옷 젖는 줄 모른다 💻 > Vue.js' 카테고리의 다른 글
자식이 부모데이터 바꾸고 싶으면 custom event (1) | 2023.10.03 |
---|---|
props 나머지 내용 조금 (2) | 2023.09.30 |
HTML 복잡해보이면 컴포넌트 Component 만들어 쓰셈 (1) | 2023.09.27 |
모달창 내에 상세페이지 만들기 (0) | 2023.09.26 |
실제 데이터를 넣어 상품목록을 만들자 (import / export) (0) | 2023.09.18 |