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

[Vue.js] ๋ชจ๋‹ฌ์ฐฝ ๋‚ด์— ์ƒ์„ธ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

by Connecting-the-dots 2022. 4. 1.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ์ด๋ฒˆ์—๋Š” ํด๋ฆญํ•œ ์ƒํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ๋ชจ๋‹ฌ์ฐฝ ๋‚ด์— ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.
  • ์ง„์งœ ๋ถ€๋™์‚ฐ ์–ดํ”Œ์ฒ˜๋Ÿผ ์ƒํ’ˆ๋งˆ๋‹ค ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‚ฌ์ง„์„ ์ธ๋„ค์ผ๋กœ ๋ณด์—ฌ์ฃผ๊ณ  ํด๋ฆญํ•˜๋ฉด ํฌ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•ด๋ณด๋ฉด ๋” ์žฌ๋ฏธ์žˆ์—ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๊ฑด ๋ณ„๋กœ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๊ฐ€๋Šฅํ•  ๋“ฏ!

๐Ÿ’œ ๋ชจ๋‹ฌ์ฐฝ ๋‚ด์— ์ƒ์„ธ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

๐Ÿค ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ๋ชจ๋‹ฌ์ฐฝ ๋‚ด์— ์ฒซ ๋ฒˆ์งธ ์ƒํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

  • ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๊ฐ์„ ์žก๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ๋จผ์ € ํ•˜๋‚˜๋งŒ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์„ ํ•ด๋ณด๋ฉด์„œ ์–ด๋–ค ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๋ฉด ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋„ ๋˜‘๊ฐ™์ด ์ ์šฉ์„ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ฐ์„ ์žก๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
{
    id : 0,
    title: "Sinrim station 30 meters away",
    image: "https://codingapple1.github.io/vue/room0.jpg",
    content: "18๋…„ ์‹ ์ถ•๊ณต์‚ฌํ•œ ๋‚จํ–ฅ ์›๋ฃธ โ˜€๏ธ, ๊ณต๊ธฐ์ฒญ์ •๊ธฐ ์ œ๊ณต",
    price: 340000
}

 

<div class="black-bg" v-if="openModal == true" @click="close($event)" >
    <div class="white-bg">
        <img :src="rooms[0].image" class="detail-room-image">
        <h4>{{ rooms[0].title }}</h4>
        <p>{{ rooms[0].content }}</p>
        <p>{{ rooms[0].price }}์›</p>
        <button class="close">๋‹ซ๊ธฐ</button>
    </div>
</div>
  • ๋ชจ๋‹ฌ์ฐฝ ๋‚ด ์ฒซ๋ฒˆ์งธ ์ƒํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋‚ด์šฉ์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์€ ์œ„์™€ ๊ฐ™๋‹ค.
  • ๋‚˜๋Š” id ๋ฅผ ์ œ์™ธํ•˜๊ณ  title, image, content, price ๋ชจ๋‘ ์ƒ์„ธ ํŽ˜์ด์ง€์— ๋‹ด์•„์ฃผ์—ˆ๋‹ค.

๐Ÿค ๋ชจ๋‹ฌ์ฐฝ ๋‚ด์— ํด๋ฆญํ•œ ์ƒํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

  • ์ด์ œ ์œ„์˜ html ์ฝ”๋“œ์—์„œ 0 ์ด๋ผ๊ณ  ์ž‘์„ฑํ•œ ๋ถ€๋ถ„๋งŒ ํด๋ฆญํ•œ ์ƒํ’ˆ์˜ ์ธ๋ฑ์Šค ํ˜น์€ ํด๋ฆญํ•œ ์ƒํ’ˆ์˜ id ๋กœ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, 0๋ฒˆ ์ธ๋ฑ์Šค์˜ ์ƒํ’ˆ์„ ํด๋ฆญํ•˜๋ฉด 0๋ฒˆ ์ƒํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€, 1๋ฒˆ ์ธ๋ฑ์Šค์˜ ์ƒํ’ˆ์„ ํด๋ฆญํ•˜๋ฉด 1๋ฒˆ ์ƒํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€.. ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ง์ด๋‹ค.
  • React ์—์„œ๋Š” state ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์—ˆ์ง€๋งŒ, Vue ์˜ ๊ฒฝ์šฐ์—๋Š” data ๋ณด๊ด€ํ•จ์— ํด๋ฆญํ•œ ์ƒํ’ˆ์˜ ์ธ๋ฑ์Šค ํ˜น์€ ํด๋ฆญํ•œ ์ƒํ’ˆ์˜ id ๋ฅผ ๋ณด๊ด€ํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ๋‹ค๋ฅธ ์ƒํ’ˆ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

data(){
    return {
        clickedRoom : 0,
    }
}
  • ๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด data ๋ณด๊ด€ํ•จ์— clickedRoom ์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํด๋ฆญํ•œ ์ƒํ’ˆ์˜ ์ธ๋ฑ์Šค ํ˜น์€ id ๋ฅผ ๋ณด๊ด€ํ•ด์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ณ , ์ดˆ๊ธฐ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

 

<div class="card" v-for="(room, i) in rooms" :key="i">
    <img :src="room.image" class="room-image">
    <h4  class="room-name" @click="openModal = true; clickedRoom = i">{{ room.title }}</h4>
    <p>{{ room.price }}์›</p>
    <span>์‹ ๊ณ  ์ˆ˜: {{ report[room.id] }}</span> <button class="report" @click="increase(room.id)">ํ—ˆ์œ„๋งค๋ฌผ์‹ ๊ณ </button>
</div>
  • ๊ทธ๋ฆฌ๊ณ  ์ƒํ’ˆ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋Š” ์ƒํ’ˆ๋ช…์„ ํด๋ฆญํ•ด์•ผ ์—ด๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— room-name ์ด๋ผ๋Š” class ๋ฅผ ๊ฐ€์ง„ h4 ํƒœ๊ทธ์˜ @click ์†์„ฑ์— clickedRoom = i ๋ผ๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
  • card ๋ผ๋Š” class ๋ฅผ ๊ฐ€์ง„ div ํƒœ๊ทธ๋Š” v-for ๋ฌธ๋ฒ•์— ์˜ํ•ด ๋ฐ˜๋ณต๋˜๋ฉด์„œ rooms ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜์–ด ๋ ˆ์ด์•„์›ƒ์ด ์ƒ์„ฑ๋˜๋Š”๋ฐ, ์ด ๋•Œ ๊ฐ ์š”์†Œ๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ถ€์—ฌ๋œ i ๋ฅผ ํ™œ์šฉํ•œ ๊ฒƒ์ด๋‹ค.

๐Ÿ’œ v-if / v-else ๋ฌธ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

<div v-if="1 == 2">
  ์•ˆ๋…•ํ•˜์„ธ์š”
</div>
<div v-else-if="1 == 3">
  ์•ˆ๋…•ํ•˜์„ธ์š”2
</div>
<div v-else>
  ์•ˆ๋…•ํ•˜์„ธ์š”3
</div>
  • JavaScript ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด if ๋ฌธ, if-else ๋ฌธ ๋“ฑ๊ณผ ๊ฐ™์ด if ๋ฌธ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ฒŒ ๋œ๋‹ค.
  • Vue ์—์„œ๋„ ์ด์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” v-if ๋ฌธ, v-else ๋ฌธ ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค.
  • ์ด์ „์— ๋ฐฐ์šด v-if="์กฐ๊ฑด์‹" ์ด๋ผ๋Š” ๋ฌธ๋ฒ•์€ ์กฐ๊ฑด์‹์ด ์ฐธ์ผ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น ๋ฌธ๋ฒ•์ด ๋“ค์–ด์žˆ๋Š” html ํƒœ๊ทธ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ๊ทผ๋ฐ v-else ๋ผ๋Š” ๋ฌธ๋ฒ•๋„ ์กด์žฌํ•˜๋Š”๋ฐ, ์ด๋Š” v-if ๋ฌธ์— ์ ์€ ์กฐ๊ฑด์‹์ด ์ฐธ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์— v-else ๋ฌธ์ด ๋“ค์–ด์žˆ๋Š” html ํƒœ๊ทธ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
  • ๋ฌผ๋ก , ์กฐ๊ฑด๋ฌธ์ด 3๊ฐœ ์ด์ƒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” v-else-if ๋ฌธ๋„ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•