[Vue.js] ํ ํ๋ฆฟ ๋ฌธ๋ฒ ๋ฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
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๋ฅผ ์ฒ์ ์ ํ๋ ๊ฐ๋ฐ์๋ถ๋ค์ด์๋ผ๋ฉด ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ ์ ์ฐ์ฑ๊ณผ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๊ฐ๋ ฅํจ์ ๋์ฑ ๋งค๋ ฅ์ ๋๋ผ์ง ์์๊น ์ถ์ต๋๋ค. ๐