๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/Vue.js

[Vue.js] Component ๋งŒ๋“ค๊ธฐ

by Connecting-the-dots 2022. 4. 2.
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
๋ฐ˜์‘ํ˜•