๐ฏ ํ์ต ๋ชฉํ
- Vue ์ธ์คํด์ค์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ์ง์ ๊ตฌ์ฑํ ์ ์๋ค.
- ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ ํตํด ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ณ ๋์ ์ผ๋ก ๋ฐ์ธ๋ฉํ ์ ์๋ค.
1๏ธโฃ Vue ์ธ์คํด์ค๋?
Vue ์ฑ์ new Vue()
๋ก ์์ํ๋ Vue ์ธ์คํด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํฉ๋๋ค.
Vue 2์์๋ ์ด ์ธ์คํด์ค๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๊ณ , DOM๊ณผ ์ฐ๊ฒฐ(binding)ํฉ๋๋ค.
๐ง main.js ์์
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
new Vue({
render: h => h(App),
}).$mount('#app')
render: h => h(App)
๋ ๋ฃจํธ ์ปดํฌ๋ํธ(App.vue)๋ฅผ DOM์ ๋ ๋๋งํฉ๋๋ค.
2๏ธโฃ ํ ํ๋ฆฟ ๋ฌธ๋ฒ ๊ธฐ๋ณธ
โ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ (Interpolation)
<template>
<div>
<h1>{{ message }}</h1>
</div>
</template>
<script>
export default {
data() {
return {
message: '์๋
ํ์ธ์, Vue!'
}
}
}
</script>
โ
์์ฑ ๋ฐ์ธ๋ฉ: v-bind
<img v-bind:src="imageUrl" alt="์ด๋ฏธ์ง" />
์ถ์ฝํ: :src="imageUrl"
3๏ธโฃ ๋๋ ํฐ๋ธ(Directive)
โ
์กฐ๊ฑด ๋ ๋๋ง: v-if
, v-else
, v-show
<p v-if="isLoggedIn">ํ์ํฉ๋๋ค!</p>
<p v-else>๋ก๊ทธ์ธ ํด์ฃผ์ธ์.</p>
โ
๋ฐ๋ณต ๋ ๋๋ง: v-for
<ul>
<li v-for="(item, index) in items" :key="index">
{{ index + 1 }}. {{ item }}
</li>
</ul>
<script>
export default {
data() {
return {
items: ['HTML', 'CSS', 'Vue']
}
}
}
</script>
4๏ธโฃ ์ด๋ฒคํธ ํธ๋ค๋ง: v-on
<button v-on:click="handleClick">ํด๋ฆญ</button>
์ถ์ฝํ: @click="handleClick"
methods: {
handleClick() {
alert('๋ฒํผ์ด ํด๋ฆญ๋์์ต๋๋ค!')
}
}
๐ป ์ค์ต: ๊ฐ๋จํ ํ ์ผ ๋ฆฌ์คํธ
<template>
<div class="todo-container">
<h2>๐ ์ค๋์ ํ ์ผ</h2>
<div class="form">
<input v-model="newTodo" placeholder="ํ ์ผ์ ์
๋ ฅํ์ธ์" />
<button @click="addTodo">์ถ๊ฐ</button>
</div>
<ul class="todo-list">
<li v-for="(todo, i) in todos" :key="i">
โ
{{ todo }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
newTodo: '',
todos: []
}
},
methods: {
addTodo() {
if (this.newTodo.trim()) {
this.todos.push(this.newTodo.trim())
this.newTodo = ''
}
}
}
}
</script>
<style scoped>
.todo-container {
max-width: 400px;
margin: 40px auto;
padding: 24px;
border: 1px solid #ccc;
border-radius: 12px;
background: #f9f9f9;
box-shadow: 0 4px 10px rgba(0,0,0,0.05);
}
.todo-container h2 {
text-align: center;
margin-bottom: 20px;
}
.form {
display: flex;
gap: 8px;
margin-bottom: 16px;
}
.form input {
flex: 1;
padding: 8px;
border: 1px solid #aaa;
border-radius: 6px;
font-size: 14px;
}
.form button {
padding: 8px 16px;
background-color: #42b983;
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
}
.form button:hover {
background-color: #36956d;
}
.todo-list {
list-style: none;
padding: 0;
}
.todo-list li {
padding: 6px 0;
font-size: 16px;
border-bottom: 1px dashed #ddd;
}
</style>
โ ๋ง๋ฌด๋ฆฌ ์ ๋ฆฌ
- Vue ์ธ์คํด์ค๋ ์ฑ์ ๋ฟ๋ฆฌ์ด๋ฉฐ,
data
,methods
๋ฑ์ ์ต์ ์ ๊ฐ์ง๋๋ค. - ํ ํ๋ฆฟ ๋ฌธ๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํ๊ฑฐ๋ ์กฐ๊ฑด, ๋ฐ๋ณต, ์ด๋ฒคํธ๋ฅผ ์ ์ดํฉ๋๋ค.
v-model
์ ์ด์ฉํด ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ๋ ๊ฐ๋จํ ๊ตฌํํ ์ ์์ต๋๋ค.
๐ฌ ๋๊ธ
โป ๋ก๊ทธ์ธ ํ ๋๊ธ์ ์์ฑํ ์ ์์ต๋๋ค.