๐Ÿ“— Vue.js

[Vue.js] ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ• ๋ฐ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

JaeBBang 2024. 12. 2. 15:34

1. ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์ด๋ž€?

Vue.js์˜ ํ…œํ”Œ๋ฆฟ์€ HTML ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜๋ฉฐ, ์ผ๋ฐ˜ HTML ํƒœ๊ทธ์— Vue๋งŒ์˜ ํŠน๋ณ„ํ•œ ๋ฌธ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋™์ ์ธ ์ฝ˜ํ…์ธ ๋ฅผ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์€ ๋ฐ์ดํ„ฐ์™€ DOM์„ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ๋ณด๊ฐ„๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ณด๊ฐ„๋ฒ• (Interpolation)

Vue ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์˜ ํ•ต์‹ฌ์€ ๋ณด๊ฐ„๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด์ค‘ ์ค‘๊ด„ํ˜ธ(์ฝง์ˆ˜์—ผ ๊ด„ํ˜ธ) {{  }} ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ…œํ”Œ๋ฆฟ์— ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<template>
  <div>{{ title }}</div>
  <p>{{ new Date().toLocaleDateString() }}</p>
</template>
<script setup>
import { ref } from 'vue'
const title = ref('Vue.js ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•')
</script>

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” title ๋ฐ์ดํ„ฐ์™€ ํ˜„์žฌ ๋‚ ์งœ๊ฐ€ ๋™์ ์œผ๋กœ ํ™”๋ฉด์— ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ™”๋ฉด๋„ ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

 

2. ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด๋ž€?

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ Vue.js์—์„œ ํ…œํ”Œ๋ฆฟ๊ณผ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. Vue.js๋Š” DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ์™€ UI๋ฅผ ๋™๊ธฐํ™”ํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. 

 

๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ, ํ…œํ”Œ๋ฆฟ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

<template>
  <img :src="imageUrl" alt="์ด๋ฏธ์ง€" />
  <p>{{ new Date().toLocaleDateString() }}</p>
</template>
<script setup>
import { ref } from 'vue'
const imageUrl = ref('https://example.com/image.png')
</script>

 

์œ„ ์ฝ”๋“œ์—์„œ :src๋Š” v-bind์˜ ์ถ•์•ฝํ˜•์œผ๋กœ, ๋ฐ์ดํ„ฐ imageUrl์„ <img> ํƒœ๊ทธ์˜ src ์†์„ฑ์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

 

์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

v-model ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

<template>
  <input v-model="name" placeholder="์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”." />
  <p>์•ˆ๋…•ํ•˜์„ธ์š”, {{ name }}๋‹˜</p>
  <p>{{ new Date().toLocaleDateString() }}</p>
</template>
<script setup>
import { ref } from 'vue'
const name = ref('')
</script>

์ž…๋ ฅ ํ•„๋“œ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด name ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ , ๋ฐ˜๋Œ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ž…๋ ฅ ํ•„๋“œ ๊ฐ’์ด ์ฆ‰์‹œ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

 

3. Vue.js ๋””๋ ‰ํ‹ฐ๋ธŒ์˜ ํ™œ์šฉ

Vue ํ…œํ”Œ๋ฆฟ์—์„œ ๋””๋ ‰ํ‹ฐ๋ธŒ๋Š” HTML ํƒœ๊ทธ์— ๋™์ ์ธ ๋™์ž‘์„ ๋ถ€์—ฌํ•˜๋Š” ํŠน๋ณ„ํ•œ ์†์„ฑ์ž…๋‹ˆ๋‹ค. v-๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง (v-if, v-else)

๋ฐ์ดํ„ฐ ์ƒํƒœ์— ๋”ฐ๋ผ ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

<template>
  <p v-if="isLoggedIn">ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!</p>
  <p v-else>๋กœ๊ทธ์ธํ•ด์ฃผ์„ธ์š”.</p>
  <p>{{ new Date().toLocaleDateString() }}</p>
</template>
<script setup>
import { ref } from 'vue'
const isLoggedIn = ref(false)
</script>

 

isLoggedIn ๊ฐ€ false์ผ ๊ฒฝ์šฐ

 

isLoggedIn ๊ฐ€ true์ผ ๊ฒฝ์šฐ

 

๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง (v-for)

๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ Œ๋”๋งํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<template>
  <li v-for="(item, index) in items" :key="index">{{ item }}</li>
  <p>{{ new Date().toLocaleDateString() }}</p>
</template>
<script setup>
import { ref } from 'vue'
const items = ref(['apple', 'banana', 'melon', 'grape'])
</script>

 

4. ํด๋ž˜์Šค์™€ ์Šคํƒ€์ผ ๋ฐ”์ธ๋”ฉ

HTML์˜ ํด๋ž˜์Šค๋‚˜ ์Šคํƒ€์ผ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ๋ฐ”์ธ๋”ฉ

<template>
  <div class="main_class" :class="{ active: isActive }">ํด๋ž˜์Šค ๋ฐ”์ธ๋”ฉ</div>
  <p>{{ new Date().toLocaleDateString() }}</p>
</template>
<script setup>
import { ref } from 'vue'
const isActive = ref(true)
</script>
<style scoped>
.main_class {
  color: blue;
}

.main_class.active {
  font-size: 50px;
}
</style>

 

isActive๊ฐ€ false์ผ ๊ฒฝ์šฐ

 

isActive๊ฐ€ true์ผ ๊ฒฝ์šฐ

์œ„์™€ ๊ฐ™์ด ๊ธฐ์กด์˜ main_class์— :class๋ฅผ ํ†ตํ•ด active ํด๋ž˜์Šค๋ฅผ

isActive์˜ ture, false๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ถ”๊ฐ€, ์ œ๊ฑฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์Šคํƒ€์ผ ๋ฐ”์ธ๋”ฉ

<template>
  <div :style="{ color: textColor, fontSize: fontSize + 'px' }">
    ์Šคํƒ€์ผ ์ ์šฉ ์˜ˆ์ œ
  </div>
  <p>{{ new Date().toLocaleDateString() }}</p>
</template>
<script setup>
import { ref } from 'vue'
const textColor = ref('red')
const fontSize = ref(16)
</script>

 

 

5. ํ…œํ”Œ๋ฆฟ์—์„œ JavaScript ํ‘œํ˜„์‹ ์‚ฌ์šฉ

ํ…œํ”Œ๋ฆฟ์—์„œ๋Š” JavaScript ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ์กฐ๊ฑด๋ถ€ ๋กœ์ง์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<template>
  <p>{{ count > 0 ? '์–‘์ˆ˜์ž…๋‹ˆ๋‹ค' : '์Œ์ˆ˜์ž…๋‹ˆ๋‹ค' }}</p>
  <p>{{ new Date().toLocaleDateString() }}</p>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(5)
</script>

 

 

๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋А๋‚€ ์ ์€ Vue.js์˜ ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์œผ๋กœ HTML๊ณผ JavaScript๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ์— ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ฐธ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ์™€ UI ๊ฐ„์˜ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง๊ด€์ ์ธ ๊ฐœ๋ฐœ์„ ์‰ฝ๊ฒŒ ๋„์™€์ค„๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

Vue.js๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์ด์‹œ๋ผ๋ฉด ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ•์˜ ์œ ์—ฐ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์˜ ๊ฐ•๋ ฅํ•จ์— ๋”์šฑ ๋งค๋ ฅ์„ ๋А๋ผ์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Š