<Do it! Vue.js ์ ๋ฌธ>์ ๊ธฐ๋ณธ์ผ๋ก ๋ฐฐ์ด ๋ด์ฉ์ ๋๋ค.
๋ชฉ์ฐจ
- <Vue์ template์์ฑ>
- 1. ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(Data Binding)
- 2. ๋๋ ํฐ๋ธ(Directive)
- 3. ๊ณ ๊ธ ํ ํ๋ฆฟ ๊ธฐ๋ฒ
<Vue์ template์์ฑ>
- template์ด๋ ๋ทฐ๋ก ํ๋ฉด์ ์กฐ์ํ๊ธฐ ์ํด ์ ๊ณต๋๋ ๋ฌธ๋ฒ์ด๋ค.
- template์์ฑ์ HTML, CSS ๋ฑ์ ๋งํฌ์ ์์ฑ๊ณผ ๋ทฐ ์ธ์คํด์ค์์ ์ ์ํ ๋ฐ์ดํฐ ๋ฐ ๋ก์ง๋ค์ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๋ณผ ์ ์๋ ํํ์ HTML๋ก ๋ณํํด์ค๋ค. ์ฌ์ฉ์๊ฐ ๋ณผ ์๋ ์์ง๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์ ์ผ๋ก template์์ฑ์์ ์ ์ํ ๋งํฌ์ +๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ๋ ๊ธฐ๋ฐ์ render()ํจ์๋ก ๋ณํํ๋ค. ๋ณํ๋ reder()ํจ์๋ ์ต์ข ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๊ฒ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ญํ ์ ํ๋ค.
- temlate์์ฑ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
1. ES5
<script>
new Vue({
template: '<p>Hello {{ message }}</p>'
});
</script>
2. ES6 : ์ฑ๊ธ ํ์ผ ์ปดํฌ๋ํธ ์ฒด๊ณ
<template>
<p>Hello {{ message }}</p>
</template>
1. ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(Data Binding)
HTML ํ๋ฉด ์์๋ฅผ ๋ทฐ ์ธ์คํด์ค์ ๋ฐ์ดํฐ์ ์ฐ๊ฒฐํ๋ ๊ฒ
1) {{}}
๋ทฐ ์ธ์คํด์ค์ ๋ฐ์ดํฐ๋ฅผ HTML ํ๊ทธ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ ์คํธ ์ฝ์ ๋ฐฉ์
<div id="app"> //v-once ์์ฑ์ ์ถ๊ฐํ๋ฉด 1ํ๋ง ๋ฐ์ธ๋ฉํ ์ ์๋ค.
{{ message }}
</div>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!'
}
});
</script>
{{}}์์ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ์ด ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ์ธ๋ฌธ๊ณผ ๋ถ๊ธฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๊ณ , ๋ณต์กํ ์ฐ์ฐ์ ์ธ์คํด์ค ์์์ ์ฒ๋ฆฌํ๊ณ ํ๋ฉด์๋ ๊ฐ๋จํ ์ฐ์ฐ ๊ฒฐ๊ด๋ง ํ์ํด์ผ ํ๋ค.
<div id="app">
<!-- X, ์ ์ธ๋ฌธ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ -->
{{ var a = 10; }}
<!-- X, ๋ถ๊ธฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ -->
{{ if (true) {return 100} }}
<!-- X, ๋ณต์กํ ์ฐ์ฐ์ ์ธ์คํด์ค ์์์ ์ํ -->
{{ message.split('').reverse().join('') }}
<!-- O, ์ผํญ ์ฐ์ฐ์๋ก ํํ ๊ฐ๋ฅ -->
{{ true ? 100 : 0 }}
<!-- O, ์คํฌ๋ฆฝํธ์์ computed ์์ฑ์ผ๋ก ๊ณ์ฐ ํ ์ต์ข
๊ฐ๋ง ํํ -->
{{ reversedMessage }}
</div>
2) v-bind
- ์์ด๋, ํด๋์ค, ์คํ์ผ ๋ฑ์ HTML ์์ฑ ๊ฐ์ ๋ทฐ ๋ฐ์ดํฐ ๊ฐ์ ์ฐ๊ฒฐํ ๋ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ์ฐ๊ฒฐ ๋ฐฉ์
- v-bind: ๋ฌธ๋ฒ์ :๋ก ๊ฐ์ํํ ์ ์๋ค. ํ์ง๋ง, v-bind์์ฑ์ ์ด์ฉํ๋ ๊ฒ์ด ๊ตฌ๋ถํ๊ธฐ ์ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
ex) HTML์์ฑ๊ฐ์ ๋ทฐ ๋ฐ์ดํฐ ๊ฐ์ ์ฐ๊ฒฐ
<html>
<head>
<title>Vue Template - Data Binding</title>
</head>
<body>
<div id="app">
<p v-bind:id="idA">์์ด๋ ๋ฐ์ธ๋ฉ</p>
<p v-bind:class="classA">ํด๋์ค ๋ฐ์ธ๋ฉ</p>
<p v-bind:style="styleA">์คํ์ผ ๋ฐ์ธ๋ฉ</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
idA: 10,
classA: 'container',
styleA: 'color: blue'
}
});
</script>
</body>
</html>
2. ๋๋ ํฐ๋ธ(Directive)
- ํ๋ฉด์ ์์๋ฅผ ๋ ์ฝ๊ฒ ์กฐ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ทฐ์ ๋ฐ์ดํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๋ ํ๋ฉด์ ์์๋ค์ ์ง์ ์ ์ดํ ํ์ ์์ด ์์๋ค์ด Reactiveํ๊ฒ ๋ฐ์ํ์ฌ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ ๊ฐ์ ๋ฐ๋ผ ๊ฐฑ์ ๋๋ค.
- HTMLํ๊ทธ ์์ v-์ ๋์ฌ๋ฅผ ๊ฐ์ง๋ ๋ชจ๋ ์์ฑ๋ค์ ์๋ฏธํ๋ค.
//๋๋ ํฐ๋ธ ํ์
<a v-if="flag">๋์ Vue.js</a>
๋๋ ํฐ๋ธ ์ด๋ฆ | ์ญํ |
v-if | ์ง์ ํ ๋ทฐ ๋ฐ์ดํฐ ๊ฐ์ ์ฐธ, ๊ฑฐ์ง ์ฌ๋ถ์ ๋ฐ๋ผ ํด๋น HTML ํ๊ทธ๋ฅผ ํ๋ฉด์ ํ์ํ๊ฑฐ๋ ํ์ํ์ง ์๋๋ค. |
v-for | ์ง์ ํ ๋ทฐ ๋ฐ์ดํฐ์ ๊ฐ์๋งํผ ํด๋น HTMLํ๊ทธ๋ฅผ ๋ฐ๋ณต ์ถ๋ ฅํ๋ค. |
v-show | v-if์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ค. (๋จ, v-if๋ ํด๋น ํ๊ทธ๋ฅผ ์์ ํ ์ญ์ ํ์ง๋ง, v-show๋ cssํจ๊ณผ๋ง display:none;์ผ๋ก ์ง์ ํ๋ค.) |
v-on | ํ๋ฉด ์์์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ์ฌ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, v-on:click;์ ํด๋น ํ๊ทธ์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ์ฌ ํน์ ๋ฉ์๋๋ฅผ ์คํํ ์ ์๋ค. |
v-bind | HTMLํ๊ทธ์ ๊ธฐ๋ณธ ์์ฑ๊ณผ ๋ทฐ ๋ฐ์ดํฐ ์์ฑ์ ์ฐ๊ฒฐํ๋ค. |
v-model | - form์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ์์ฑ - ํผ์ ์ ๋ ฅํ ๊ฐ์ ๋ทฐ ์ธ์คํด์ค์ ๋ฐ์ดํฐ์ ์ฆ์ ๋๊ธฐํํ๋ค. ํ๋ฉด์ ์ ๋ ฅ๋ ๊ฐ์ ์ ์ฅํ์ฌ ์๋ฒ์ ๋ณด๋ด๊ฑฐ๋ watch์ ๊ฐ์ ๊ณ ๊ธ ์์ฑ์ ์ด์ฉํ์ฌ ์ถ๊ฐ ๋ก์ง์ ์ํํ ์ ์๋ค. - input, select, textarea ํ๊ทธ์๋ง ์ฌ์ฉํ ์ ์๋ค. |
1) ์ด๋ฒคํธ ์ฒ๋ฆฌ
v-on๋๋ ํฐ๋ธ์ methods์์ฑ์ ํ์ฉ
ex)
1. v-on ๋๋ ํฐ๋ธ ์ด์ฉํด ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ
<html>
<head>
<title>Vue Template - Event Handling</title>
</head>
<body>
<div id="app">
<button v-on:click="clickBtn">ํด๋ฆญ</button> //v-on๋๋ ํฐ๋ธ ์ถ๊ฐ
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
methods: {
clickBtn: function() {
alert('clicked');
}
}
});
</script>
</body>
</html>
//2. v-on๋๋ ํฐ๋ธ๋ก ๋ฉ์๋ ํธ์ถํ ๋ ์ธ์ ๊ฐ ๋๊ธฐ๊ธฐ
<html>
<head>
<title>Vue Template - Event Handling</title>
</head>
<body>
<div id="app">
<button v-on:click="clickBtn(10)">ํด๋ฆญ</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
methods: {
clickBtn: function(num) {
alert('clicked ' + num + ' times');
}
}
});
</script>
</body>
</html>
3. ๊ณ ๊ธ ํ ํ๋ฆฟ ๊ธฐ๋ฒ
1) computed์์ฑ
- ๋ฐ์ดํฐ ์ฐ์ฐ๋ค์ ์ ์ํ๋ ์์ญ
- data ์์ฑ ๊ฐ์ ๋ณํ์ ๋ฐ๋ผ ์๋์ผ๋ก ๋ค์ ์ฐ์ฐํ๋ค.
- ์บ์ฑ(๋์ผํ ์ฐ์ฐ์ ๋ฐ๋ณตํด์ ํ์ง ์๊ธฐ ์ํด ์ฐ์ฐ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฏธ๋ฆฌ ์ ์ฅํ๊ณ ์๋ค๊ฐ ํ์ํ ๋ ๋ถ๋ฌ์ด)ํ๋ค. => ๋ณต์กํ ์ฐ์ฐ์ ๋ฐ๋ณต ์ํํด์ ํ๋ฉด์ ๋ํ๋ด์ผ ํ ๋, methods์์ฑ๋ณด๋ค computed์์ฑ์ ์ด์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค.
ex)
<html>
<head>
<title>Vue Template - Computed</title>
</head>
<body>
<div id="app">
<p>{{ reversedMessage }}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!'
},
computed: {
reversedMessage: function() {
return this.message.split('').reverse().join('');
}
}
});
</script>
</body>
</html>
2) watch์์ฑ
- ๋ฐ์ดํฐ ๋ณํ๋ฅผ ๊ฐ์งํ์ฌ ์๋์ผ๋ก ํน์ ๋ก์ง์ ์ํํ๋ค.
- computed์์ฑ๊ณผ ๋น์ทํ์ง๋ง, computed์์ฑ์ ๋ด์ฅAPI๋ฅผ ํ์ฉํ ๊ฐ๋จํ ์ฐ์ฐ์ธ ๋ฐ๋ฉด์, watch์์ฑ์ ๋ฐ์ดํฐ ํธ์ถ๊ณผ ๊ฐ์ด ์๊ฐ์ด ์๋์ ์ผ๋ก ๋ ๋ง์ด ์๋ชจ๋๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ด๋ค.
ex)
<html>
<head>
<title>Vue Template - Watch</title>
</head>
<body>
<div id="app">
<input v-model="message">
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!'
},
watch: {
message: function(data) {
console.log("message์ ๊ฐ์ด ๋ฐ๋๋๋ค : ", data);
}
}
});
</script>
</body>
</html>
'๐ปWEB FrontEnd > ํ๋ ์์ํฌ Vue' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vuex (0) | 2021.02.06 |
---|---|
Single File Components ์ฒด๊ณ (0) | 2021.02.06 |
๋ทฐ HTTP ํต์ (0) | 2020.07.02 |
Vue Router (0) | 2020.07.02 |
Vue Componets ํต์ (0) | 2020.07.02 |