728x90
๋ฐ์ํ
๐ก ์ค์ต ํฌ์ธํธ!
- ๊ธฐ์กด์ App.vue ์ ์๋ ๋ด์ฉ๋ค์ Component ๋ก ๋ง๋ค์ด ์ฎ๊ธฐ๋ฉด์ ์ ๋ง ๋ง์ ์๋ฌ๋ฅผ ๋ณด์๋ค.
- ๊ฐ์ฌ๋์ด Component ๋ก ๋ง์ด ์ชผ๊ฐ๋์ผ๋ฉด ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํด๋ ๋ถ๋ถ๋ค์ props ๋ก ๋ณด๋ด๊ธฐ ํ๋๋๊น ๋ง๋ค๊ธฐ ์ ์ ๊ผญ "๋ง๋ค๋ฉด ์ป์ ์ ์๋ ์ด์ต" ์ ์๊ฐํ๊ณ ๋ง๋ค์ด์ผ ํ๋ค๋ฉด ๊ฐ์คํ๊ณ ๋ง๋ค๋ผ๊ณ ํ์ จ๋๋ฐ.. ๊ฒช์ด๋ณด๋ ๊ทธ ์ด์ ๋ฅผ ์ ๊ฒ ๊ฐ๋ค.
๐ Component ์์๋ณด๊ธฐ
- Component ๋ ํน์ HTML ํ๊ทธ ๋ฉ์ด๋ฆฌ๋ฅผ ํ ๊ธ์๋ก ์ถ์ฝํ์ฌ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ฃผ๋ ๋ฌธ๋ฒ์ ์๋ฏธํ๋ค.
- Vue ์ ์ ๋ฐ์ดํธ๋ก ์ธํด Component ์ ํด๋นํ๋ vue ํ์ผ์ 2๋จ์ด ์ด์์ผ๋ก ๊ตฌ์ฑ๋์ด์ผ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๋์๋ค.
- ์๋ฅผ ๋ค์ด, ๊ธฐ์กด์๋ Component ํ์ผ์ ์ด๋ฆ์ผ๋ก Discount.vue ์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ฉด ์ด์ ๋ DiscountBanner.vue ์ ๊ฐ์ด Discount ์ Banner, ์ด๋ ๊ฒ ๋ ๋จ์ด ์ด์๋ก ๊ตฌ์ฑ๋์ด์ผ ํ๋ค๋ ๊ฒ!
"rules": {
"vue/multi-word-component-names": "off" // ์ถ๊ฐํ ์ฝ๋
}
- ๋ง์ฝ ์ด๋ฐ ์์ผ๋ก ๊ท์ฐฎ๊ฒ ๋ ๋จ์ด ์ด์์ผ๋ก vue ํ์ผ์ ์ด๋ฆ์ ์ง๋ ๊ฒ์ด ์ซ๋ค๋ฉด, package.json ํ์ผ์ ์ด์ด rules ๋ผ๋ ํญ๋ชฉ์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ํ ์ค ์ถ๊ฐํ ๋ค์, ํฐ๋ฏธ๋์ run start serve ๋ฅผ ์ ๋ ฅํ์ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค์ ๋์์ฃผ๋ฉด ๋๋ค.
๐ ๊ฐ๋จํ Component ๋ง๋ค๊ธฐ
- ์ฒ์๋ถํฐ ๋ถ๋ชจ Component ์ ๋ฐ์ดํฐ๋ฅผ ์์ Component ๊ฐ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ์ฐ๋, ์์ Component ๊ฐ ๋ถ๋ชจ Component ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ์ด์ผ ํ๋ ๊ฒฝ์ฐ์ ํด๋นํ๋ Component ๋ฅผ ๋ฐ๋ก ๋ง๋๋ ๊ฒ์ ๋งค์ฐ ๋ณต์กํ ์ ์๋ค.
- ๊ฐ๋จํ Component ๋ฅผ ๋ง๋ค์ด๋ด์ผ๋ก์ ๋๋ต์ ์ธ Component ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ตํ๋ณด๋ ๊ฒ์ด ์ข๋ค.
- ๋๋ ์์ ๊ฐ์ด ํ ์ธ ๋ฐฐ๋๊ฐ ๋ฉ์ธํ๋ฉด์ ๋์ฌ ์ ์๋๋ก Discount ๋ผ๋ ์ด๋ฆ์ Component ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํด๋ณด์๋ค.
๐ค Component ํ์ผ ๋ง๋ค๊ธฐ
- ๋จผ์ Components ๋ผ๋ ํด๋ ์์ Discount.vue ๋ผ๋ Component ํ์ผ์ ๋ง๋ค์ด์ฃผ์๋ค.
<template>
</template>
<script>
export default {
}
</script>
<style>
</style>
- ๊ทธ ๋ค์์ Component ํ์ผ์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ์ด vue ํ์ผ์ด ํ๋์ Component ๊ฐ ๋๋ค.
- ์ด์ ์ด vue ํ์ผ์ ํ์ํ ๊ณณ์ import ํ ํ์ ๋ฑ๋กํด์ฃผ๊ณ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ์ฐธ๊ณ ๋ก, vue ํ์ผ์ ํญ์ ์์ ๊ฐ์ด ํ์์ ๋ง์ถฐ์ ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ค.
<template>
<div class="discount">
<p>์ง๊ธ ๊ฒฐ์ ํ๋ฉด 20% ํ ์ธ!</p>
</div>
</template>
<script>
export default {
name: 'Discount',
}
</script>
<style>
.discount p {
background: #eee;
margin: 0 30px;
padding: 20px 0;
border-radius: 5px;
font-size: 18px;
font-weight: bold;
}
</style>
- ์ด์ html, css ๋ฅผ ์์ฑํ์ฌ ๋ ์ด์์์ ๋ง๋ค์ด์ฃผ์๋ค.
- Component ํ์ผ์ ๋ฏธ๋ฆฌ import ํ๋ ค๋ ํ์ผ์ import ํ์ฌ ๋ฑ๋ก ํ์ ๋ ์ด์์์ ์์ฑํ๊ฑฐ๋, App.vue ์ ๊ฐ์ ํ์ผ์์ ๋ฏธ๋ฆฌ html, css ๋ฅผ ์์ฑํ ๋ค ์ฎ๊ฒจ์ฃผ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ํตํด ๋ด๊ฐ๋ฉด์ ์์ ํ์ฌ ์ ์ฉํ ์ ์๋ค.
(Component ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ฒ์์ด๊ฑฐ๋ ์ต์ํ์ง ์์ผ๋ฉด ํ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํธํ๋ค.)
๐ค Component ์ฌ์ฉํ๊ธฐ
// ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ๋ถํ์ํ ๋ถ๋ถ์ ์ ์ธํ๋ค.
<template>
<Discount/> // 3. ์ฌ์ฉํ๊ธฐ
</template>
<script>
import Discount from './components/Discount.vue' // 1. import ํ๊ธฐ
export default {
components: {
Discount: Discount, // 2. ๋ฑ๋กํ๊ธฐ
},
};
</script>
<style>
</style>
- import ํ๊ธฐ : ์ด์ ํด๋น Component ๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ vue ํ์ผ์ <script></script>์์ ์ํ๋ ๋๋ก ์ด๋ฆ์ ์ ํ์ฌ Component ๋ฅผ import ํด์ค๋ค.
- ๋ฑ๋กํ๊ธฐ : ๊ทธ ๋ค์์ components ์์ object ํ์์ผ๋ก Component ๋ฅผ ๋ฑ๋กํ๋ฉด ๋๋๋ฐ, ๋ง์ฝ components ๋ผ๋ ํญ๋ชฉ์ด ์๋ค๋ฉด ์์ ๊ฐ์ด ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
(key ์ ํด๋นํ๋ ๋ถ๋ถ์ ์ํ๋ ๋๋ก ์ด๋ฆ์ ๋ถ์ฌ์ฃผ๋ฉด ๋๊ณ , value ์ ํด๋นํ๋ ๋ถ๋ถ์ import ํ ๋ Component ์ ๋ถ์ฌ์ฃผ์๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋ณดํต์ ์๋ก ์ด๋ฆ์ง๊ธฐ ๊ท์ฐฎ์์ ๊ทธ๋ฅ ๋๊ฐ์ด ์ฌ์ฉํ๋ค.) - ์ฌ์ฉํ๊ธฐ : ๋ง์ง๋ง์ผ๋ก <template></template> ์์์ ์ํ๋ ์์น์ key ์ ์ง์ ํ ์ด๋ฆ์ผ๋ก Component ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๐ ๋ถ๋ชจ Component ์ ๋ฐ์ดํฐ๋ฅผ ์์ Component ๊ฐ ์ฌ์ฉํ๊ธฐ
- ๋ง์ ํ๊ทธ๋ค์ด ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํตํด ์ ๊ธฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ Component ๋ฅผ ๋ง๋ค๋ค๋ณด๋ฉด ๋ถ๋ชจ Component ์ ๋ฐ์ดํฐ๋ฅผ ์์ Component ๊ฐ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
- ๊ทธ๋ ๋ค๊ณ ๋ถ๋ชจ Component ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ณธ์ ๋ง๋ค์ด ์์ Component ์์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ ๋๋ง๋ค ์๋ณธ๊ณผ ์ฌ๋ณธ ๋ชจ๋ ์์ ํด์ ์ ๋ฐ์ดํธ ์ฌํญ์ ๋ฐ์ํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์ด ์ํฉ์ด ๋ฐ์ํ๋ค.
- ๋ฐ๋ผ์, ์ณ์ ๋ฐฉ๋ฒ์ ๋ถ๋ชจ Component ์ ๋ฐ์ดํฐ๋ฅผ ์์ Component ๋ก ์ ์กํด์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
- ํ์ Component ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ค๋ฉด React ์ ์ ์ฌํ๊ฒ props ๋ผ๋ ๋ฌธ๋ฒ์ ํตํด, ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ํ ๋ฑ๋กํ์ฌ ์ฌ์ฉํด์ผํ๋ค.
๐ค ๋ถ๋ชจ Component ์ ๋ฐ์ดํฐ๋ฅผ ์์ Component ๋ก ๋ณด๋ด๊ธฐ
- ์ฝ๋๋ฅผ ๋ชจ๋ ์์ฑํ ์๋ ์๊ธฐ์ ํต์ฌ๋ง ์์ฑํ๋ค.
// ๋ถ๋ชจ Component ์ template ์ ์์ฑ
<Modal :openModal="openModal"/>
- ์๋ฅผ ๋ค์ด, Modal ์ด๋ผ๋ ์์ Component ๊ฐ ์์ฑ๋์ด ์๊ณ , ์ฌ๊ธฐ์ ๋ถ๋ชจ Component ์ data ๋ณด๊ดํจ์ ์ ์ฅ๋ openModal ์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํด์ฃผ์ด์ผ ํ๋ค๋ฉด ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
- <Modal :์์_Component_์์_์ฌ์ฉํ _์ด๋ฆ="๋ถ๋ชจ_Component_์_data_๋ณด๊ดํจ์_์ ์ฅ๋_๋ฐ์ดํฐ_์ด๋ฆ" /> ์ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
- ๊ทธ๋์ ์ฝ๋ก ( : ) ์ ์ญํ ์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ ํน์ props ์ ์ก, ์ด ๋ ๊ฐ์ง์ด๋ค.
๐ค ์์ Component ๋ก ๋ฐ์์จ ๋ฐ์ดํฐ ์ฌ์ฉํ๊ธฐ
// ์์ Component ์ script ์ ์์ฑ
export default {
name : 'Modal',
props : {
openModal : Boolean,
}
}
- ์์ Component ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ฉด <script></script> ์์ props ๋ผ๋ ํญ๋ชฉ์ ๋ง๋ค์ด์ ๊ทธ ์์ ์์ Component ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์์ Component ์์ ์ฌ์ฉํ ์ด๋ฆ์ผ๋ก ์ง์ ์ด๋ฆ์ key ๋ก ์์ฑํด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ , value ์๋ Array, Number, Boolean, String ๋ฑ ๊ณผ ๊ฐ์ด ํด๋น ๋ฐ์ดํฐ์ ์๋ฃํ์ ์ ์ด์ฃผ๋ฉด ๋๋ค.
- ์ด์ props ์ ๋ฑ๋ก๋ ๋ฐ์ดํฐ๋ ์์ Component ์ <template></template> ์์์ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ง๋ค.
๐ ์์ Component ๊ฐ ๋ถ๋ชจ Component ์ ๋ฐ์ดํฐ ๋ฐ๊พธ๊ธฐ
- ๋ถ๋ชจ Component ์ ๋ฐ์ดํฐ๋ฅผ ์์ Component ์์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ฏ์ด, ๋ฐ๋๋ก ์์ Component ์์ ๋ถ๋ชจ Component ๊ฐ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊พธ์ด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ๋ค.
- ํ์ง๋ง props ๋ก ์ ์ก๋ฐ์ ๋ฐ์ดํฐ๋ ๊ทธ๋ ๊ณ , ์ ์ด์ ๋ค๋ฅธ ํ์ผ์ ์๋ ๋ฐ์ดํฐ๋ ํ์ชฝ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ค๋ฅธ ํ์ชฝ์ ์ํฅ์ ์ฃผ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ Vue ์์ฒด์์ ์ผ๋ถ๋ฌ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง์๋์๋ค.
- ๋ฐ๋ผ์, ๊ผญ ์์ Component ๊ฐ ๋ถ๋ชจ Component ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ์ถ๋ค๋ฉด ๋ถ๋ชจ Component ์ ์์ ์ด ํ์ํ๋ค๋ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๊ณ , ๋ถ๋ชจ Component ๊ฐ ์์ Component ๋ก๋ถํฐ ํด๋น ๋ฉ์์ง๋ฅผ ์์ ํ์ฌ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
- ์ด๋ ๊ฒ ์์ Component ๊ฐ ๋ถ๋ชจ Component ์๊ฒ ๋ณ๊ฒฝํด๋ฌ๋ผ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์๊ฒ ํ๋ ๊ฒ์ด custom event ๋ฌธ๋ฒ์ด๋ค.
๐ค custom event ๋ฌธ๋ฒ ์์๋ณด๊ธฐ
<h4 class="room-name" @click="$emit('openModal', room.id)">{{ room.title }}</h4>
- ์์ Component ๋ $emit(๋ถ๋ชจ_Component_๋ก_์ ์กํ _์ด๋ฆ, ์ ์กํ _์๋ฃ) ์ ํํ๋ก ๋ถ๋ชจ Component ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค.
- ์ ์กํ ์๋ฃ ๋ถ๋ถ์ ๋ถ๋ชจ Component ์ ์ ์กํ๊ณ ์ถ์ ์๋ฃ๊ฐ ์์ ๋์๋ง ์ ํ์ ์ผ๋ก ๊ธฐ์ ํ๋ฉด ๋๋ค.
<Card @openModal="openModal = true; clickedRoom = $event"/>
- ๋ถ๋ชจ Component ๋ @๋ถ๋ชจ_Component_๋ก_์ ์กํ _์ด๋ฆ="๋ฐ์ดํฐ๋ฅผ_๋ณ๊ฒฝํ๋_JS์ฝ๋" ์ ํํ๋ก ๋ฉ์์ง๋ฅผ ์์ ํด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ๋ํ ๋ถ๋ชจ Component ๋ ์ ์กํ _์๋ฃ ๋ $event ๋ก ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
728x90
๋ฐ์ํ
'[๊ฐ๋ฐ] Practice > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] watcher ๋ก ๋ฐ์ดํฐ ๊ฐ์ํ๊ธฐ (0) | 2022.04.03 |
---|---|
[Vue.js] ์ฌ์ฉ์์ input ๋ฐ์์ค๊ธฐ (0) | 2022.04.03 |
[Vue.js] ๋ชจ๋ฌ์ฐฝ ๋ด์ ์์ธ ํ์ด์ง ๋ง๋ค๊ธฐ (0) | 2022.04.01 |
[Vue.js] import / export ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉํ๊ธฐ (0) | 2022.04.01 |
[Vue.js] v-if ์ ๋ชจ๋ฌ์ฐฝ ๋ง๋ค๊ธฐ (0) | 2022.04.01 |