Vue ๋ฌธ๋ฒ ์ ๋ฆฌ 1
Vue2 ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌ
1. ์ธ์คํด์ค์ ๋ผ์ดํ์ฌ์ดํด
โด๏ธ ์ธ์คํด์ค ์์ฑ
// main.js
import Vue from 'vue';
import App from './App.vue';
new Vue({
render: h => h(App),
}).$mount('#app');
์์ฑ๋ ์ธ์คํด์ค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ก ๋ฐ์ดํฐ์ ๋ฉ์๋๋ฅผ ๊ด๋ฆฌํ๊ณ DOM๊ณผ์ ์ํธ์์ฉ ์ฒ๋ฆฌ
โณ๏ธ ์ฃผ์ ์์ฑ ๋ฐ ์ต์
- ๋ฐ์ดํฐ (Data) : Vue ์ธ์คํด์ค์ ๋ฐ์ดํฐ๋ data ์ต์ ์ ํตํด ์ ์๋๋ฉฐ ๋ฐ์์ฑ์ ๊ฐ์ง ๐ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด DOM์ด ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋จ
new Vue({
el: '#app',
data: {
message: 'Hello, Vue!'
}
});
- ๋ฉ์๋ (Methods) : Vue ์ธ์คํด์ค์์ ์ฌ์ฉํ ์ ์๋ ํจ์ ํฌํจ
<script>
import Fruit from './components/FruitList.vue'
export default {
components:{
Fruit
},
data(){
return{
count: 0,
fruits:['Apple', 'Banana', 'Cherry']
}
},
methods:{
increase(){
this.count += 1
}
}
}
</script>
โด๏ธ ๋ผ์ดํ์ฌ์ดํด ํ
๊ฐ ์ปดํฌ๋ํธ๋ ์์ฑ๋ ๋ ์ผ๋ จ์ ์ด๊ธฐํ ๋จ๊ณ ๊ฑฐ์น๋ฉด์ ๋ผ์ดํ์ฌ์ดํด ํ ์ด๋ผ ๋ถ๋ฆฌ์ฐ๋ ํจ์๋ ์คํํ์ฌ ์ฌ์ฉ์๊ฐ ํน์ ๋จ๊ณ์์ ์์ ์ ์ฝ๋ ์ถ๊ฐ ๊ฐ๋ฅ
1. ์ธ์คํด์ค ์์ฑ ๋จ๊ณ
- beforeCreate: ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋๊ธฐ ์ง์ ์ ์คํ๋๋ ํจ์
- created: ๋ฐ์ดํฐ๋ค๊ณผ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์์ฑ๋ค์ด ๋ง๋ค์ด์ง๋ ๊ณผ์ ๊ฑฐ์น ํ ์ฆ, ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋ ์งํ์ ์คํ ๐ html ๊ตฌ์กฐ์ ์ฐ๊ฒฐ๋๊ธฐ ์
2. DOM ๋ถ์ฐฉ ๋จ๊ณ
- beforeMount : html๊ณผ ์ฐ๊ฒฐ๋๊ธฐ ์ ์ํ์ด๋ฏ๋ก html ๊ตฌ์กฐ ์กฐํ ๋ถ๊ฐ๋ฅ
- mounted : ์ธ์คํด์ค๊ฐ element์ ์ฐ๊ฒฐ๋ ํ ํธ์ถ๋จ ๐ ์ธ์คํด์ค์ element๊ฐ DOM์ ์ฝ์
๋จ.
์ค์ ํ์ฌ์ ์ปดํฌ๋ํธ๊ฐ html ๊ตฌ์กฐ์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฏ๋ก html ๊ตฌ์กฐ๋ฅผ ์กฐํํด์ ์ถ๋ ฅ ๊ฐ๋ฅ
2. ํ ํ๋ฆฟ ๋ฌธ๋ฒ
โด๏ธ ๋ณด๊ฐ๋ฒ (Interpolation) & ๋๋ ํฐ๋ธ (v- )
๐ ํ ์คํธ๋ HTML ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ๋ฒ
- ํ
์คํธ : ์ด์ค ์ค๊ดํธ ์ฌ์ฉ
- v-once : ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์ ๋ฐ์ดํธ๋์ง ์๋ ์ผํ์ฑ ๋ณด๊ฐ ์ํ
<div id="app">
<p>{{ message }}</p>
</div>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello, Vue!'
}
});
</script>
<span v-once>๋ค์๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค: {{ msg }}</span>
- HTML : HTML ํ๊ทธ๋ฅผ ํฌํจํ ๋ฌธ์์ด์ DOM์ ์ฝ์
- v-html
<div id="app">
<p>Using mustaches: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
</div>
<script>
new Vue({
el: '#app',
data: {
rawHtml: '<span style="color: red">This should be red.</span>'
}
});
</script>
- ์ ๋ฌ ์ธ์ : HTML ์์ฑ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ ๋ ์ฌ์ฉ
- v-bind : HTML ์์ฑ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ ๋ ์ฌ์ฉ ๐ HTML ์์ฑ ๊ฐฑ์ ํ๋๋ฐ ์ฌ์ฉ
- v-on : DOM ์ด๋ฒคํธ ์์
<!-- ์ ์ฒด ๋ฌธ๋ฒ -->
<a v-bind:href="url"> ... </a>
<!-- ์ฝ์ด -->
<a :href="url"> ... </a>
๐ href๋ ์ ๋ฌ์ธ์๋ก element์ href ์์ฑ์ ํํ์ url์ ๊ฐ์ ๋ฐ์ธ๋
<!-- ์ ์ฒด ๋ฌธ๋ฒ -->
<a v-on:click="doSomething"> ... </a>
<!-- ์ฝ์ด -->
<a @click="doSomething"> ... </a>
๐ ์ ๋ฌ์ธ์ = ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ด๋ฆ
3. computed ์์ฑ
๋ฐ์ํ ๋ฐ์ดํฐ์ ๊ณ์ฐ๋ ์์ฑ์ ์ ์ํ ๋ ์ฌ์ฉ ๐ ์ข ์๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ค์ ๊ณ์ฐ๋จ
caching ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ํ ๋ฒ ์ฐ์ฐํด ๋์ ๊ฐ์ด ์์ผ๋ฉด ๋ฐ๋ณต์ ์ผ๋ก ํ๋ฉด์ ๋ฐ์ดํฐ์ฒ๋ผ ์ถ๋ ฅํ ๋ ๋ค์ ํ ๋ฒ ์ฐ์ฐ X
<template>
<div>
<p>์๋ณธ ๋ฉ์์ง: {{ message }}</p>
<p>์ญ์ ๋ฉ์์ง: {{ reversedMessage }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello Vue.js!'
};
},
computed: {
reversedMessage() {
return this.message.split('').reverse().join('');
}
}
};
</script>
reversedMessage โ ๊ณ์ฐ๋ ๋ฐ์ดํฐ๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ฏ๋ก ํ ๋น ์ฐ์ฐ์๋ฅผ ํตํด ์ด๋ค ๊ฐ์ ํ ๋นํ๋๋ผ๋ ๋ฐ์์ ์ผ๋ก ๋์ X
๐ ๊ฐ์ ์ป์ด๋ด๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ฏ๋ก Getter
message โ ๊ฐ์ ์ป์ด๋ด๋ ์ฉ๋ or ๊ฐ์ ์ง์ ํ๋ ์ฉ๋
๐ Getter, Setter ๋ชจ๋ ์ ์ ๊ฐ๋ฅ
โด๏ธ computed ์์ฑ์์๋ setter ์ฌ์ฉํ๊ธฐ
// ...
computed: {
reversedMessage: {
// getter
get() {
return this.msg.split('').reverse().join('')
},
// setter
set(value) {
this.msg = value
}
}
},
methods:{
add(){
this.reversedMessage += '!?'
}
}
// ...
add ๋ฉ์๋ ์คํ โ set ๋ฉ์๋ ์คํ โ value ๋ถ๋ถ์๋ ๊ธฐ์กด์ reversedMessage์ !?๊ฐ ๋ถ์ด์๋ ์๋ก์ด ๊ฐ ๋ค์ด์ด โ value๊ฐ ์๋ณธ์ msg๋ผ๋ ๋ฐ์ดํฐ์ ํ ๋น โ msg๋ ํ ๋น๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋จ โ getter๋ก split, reverse, join ํตํด ์๋ก ๋ณ๊ฒฝ๋ ๊ฐ์ ๋ค์ ๋ฐํํด์ ์ถ๋ ฅ
4. ํด๋์ค์ ์คํ์ผ ๋ฐ์ธ๋ฉ
โด๏ธ HTML ํด๋์ค ๋ฐ์ธ๋ฉ
ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์ ํด๋นํ๋ ์์์ ํน์ ํ ํด๋์ค ์ด๋ฆ์ด ์ฐ๊ฒฐ๋ ๊ฒ์ธ์ง ์ ์ ๊ฐ๋ฅ
โณ๏ธ ๊ฐ์ฒด ๊ตฌ๋ฌธ
<div v-bind:class="{ active: isActive }"></div>
isActive์ ์ฐธ ์์ฑ์ ์ํด active ํด๋์ค์ ์กด์ฌ ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋จ
๐ isActive๊ฐ true๋ฉด active ํด๋์ค๊ฐ ์ฐ๊ฒฐ๋จ
<div
class="static"
v-bind:class="{ active: isActive, 'text-danger': hasError }"
></div>
๊ฐ์ฒด์ ๋ ๋ง์ ํ๋๋ฅผ ํฌํจํ์ฌ ์ฌ๋ฌ ํด๋์ค๋ฅผ ์ ํ ๊ฐ๋ฅ
โ ๏ธ ํน์๊ธฐํธ๊ฐ ๋ค์ด๊ฐ๋ camelcase๊ฐ ์๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ผํ๋ค๋ฉด ๋ฐ์ดํ('') ์ฌ์ฉ
โณ๏ธ ๋ฐฐ์ด ๊ตฌ๋ฌธ
<div v-bind:class="[activeClass, errorClass]"></div>
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
โด๏ธ ์ธ๋ผ์ธ ์คํ์ผ ๋ฐ์ธ๋ฉ
์คํ์ผ ๊ฐ์ฒด์ ์ง์ ๋ฐ์ธ๋ฉํ์ฌ ํ ํ๋ฆฟ์ ๋ ๊ฐ๊ฒฐํ๋๋ก ๋ง๋๋ ๊ฒ์ด ์ข์
<div v-bind:style="styleObject"></div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
<template>
<h1
:style="[fontStyle, backgroundStyle]"
@click="changeStyle">
</h1>
</template>
<script>
export default {
data() {
return {
fontStyle: {
color: 'orange',
fontSize: '30px'
},
backgroundStyle: {
backgroundColor: 'black'
}
}
},
methods: {
changeStyle() {
this.fontStyle.color = 'red'
this.fontStyle.fontSize = '50px'
}
}
}
</script>
5. ์กฐ๊ฑด๋ถ ๋ ๋๋ง
์กฐ๊ฑด์ ๋ฐ๋ผ ๋ธ๋ก์ ๋ ๋๋งํ ๋ ์ฌ์ฉ
<h1 v-if="awesome">Vue is awesome!</h1>
- v-if
- v-else-if
- v-else
- v-show
โด๏ธ v-if์ v-show์ ์ฐจ์ด
๐ v-if๋ true์ผ ๋๋ง ํ๋ฉด์ ๋ ๋๋ง.
๐ v-show๋ ํญ์ ๋ ๋๋ง๋์ด ๊ตฌ์กฐ์ ์ธ ๋ ๋๋ง์ด ํ๋ฉด์ ์ถ๋ ฅ๋์ง ์๊ฒ๋ style ์์ฑ์ display:none ๋ถ์ฌ
๊ทธ๋ฌ๋ฏ๋ก <template> ์๋ฆฌ๋จผํธ ์ง์ํ์ง ์์ผ๋ฉฐ v-else์ ํจ๊ป ์ฌ์ฉ ๋ถ๊ฐ
๐ฅ ์์ฃผ ์ ํํด์ผ ํ๋ค๋ฉด v-show ์ฌ์ฉํ๋ ๊ฒ ์ข๊ณ , ๋ฐํ์ ์ ์กฐ๊ฑด์ด ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ฉด v-if ์ฌ์ฉํ๋ ๊ฒ ๋ ๋์!
6. ๋ฆฌ์คํธ ๋ ๋๋ง v-for
<template>
<ul>
<li
v-for="fruit in newFruits"
:key="fruit.id">
{{ fruit.name }}
</li>
</ul>
</template>
<script>
export default {
data(){
return{
fruits:['Apple', 'Banana', 'Cherry']
}
},
computed:{
newFruits(){
return this.fruits.map((fruit, index) => {
return {
id: index,
name: fruit
}
})
}
}
}
</script>
โด๏ธ ๋ณ์ด ๋ฉ์๋
- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()
โด๏ธ ๋ฐฐ์ด ๊ต์ฒด → ์๋ณธ๋ฐฐ์ด ๋ณํํ์ง ์๊ณ ํญ์ ์ ๋ฐฐ์ด ๋ฐํ
- filter()
- concat()
- slice()
๐ ๊ธฐ์กด DOM์ ๋ฒ๋ฆฌ๊ณ ์ ์ฒด ๋ชฉ๋ก์ ๋ค์ ๋ ๋๋งํ๋ ๊ฒ X → DOM ์์ ์ฌ์ฌ์ฉํด์ ํจ์จ์ ์ผ๋ก ์์
์ฐธ๊ณ ์๋ฃ
'FE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue] devServer ๊ตฌ์ฑํ๊ณ proxy ์ค์ ํ๊ธฐ (0) | 2024.09.06 |
---|---|
[FE] ๋น๋๊ธฐ (0) | 2024.06.17 |
[FE] Vuex (0) | 2024.06.17 |
[FE] Vue ๊ฐ๋ ๋ฐ ์ค์น (0) | 2024.06.10 |