- Part1. ์์ํ๊ธฐ
- Vue.js ๋?
- ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
- Part2. Vue.js ๊ธฐ์ด
- ๊ธฐ๋ณธ ๋๋ ํฐ๋ธ
- ๋ฐ๋ณต ๋ ๋๋ง ๋๋ ํฐ๋ธ
- ๊ธฐํ ๋๋ ํฐ๋ธ
- ๊ณ์ฐํ ์์ฑ
- Part3. Vue ์ธ์คํด์ค
- el, data, computed ์ต์
- ๋ฉ์๋
- ๊ด์ฐฐ ์์ฑ
- v-cloak ๋๋ ํฐ๋ธ
- Vue ์ธ์คํด์ค ๋ผ์ดํ ์ฌ์ดํด
- Part4. ์ด๋ฒคํธ ์ฒ๋ฆฌ
- ์ธ๋ผ์ธ ์ด๋ฒคํธ ์ฒ๋ฆฌ
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฉ์๋
- ์ด๋ฒคํธ ๊ฐ์ฒด
- ๊ธฐ๋ณธ ์ด๋ฒคํธ
- ์ด๋ฒคํธ ์ ํ์ ๋ฒ๋ธ๋ง
- ์ด๋ฒคํธ ์์์ด
- once ์์์ด
- ํค์ฝ๋ ์์์ด
- ๋ง์ฐ์ค ๋ฒํผ ์์์ด
- Part5.์คํ์ผ
- ์คํ์ผ ์ ์ฉ
- ์ธ๋ผ์ธ ์คํ์ผ
- CSS ํด๋์ค ๋ฐ์ธ๋ฉ
- ๊ณ์ฐํ ์์ฑ, ๋ฉ์๋๋ฅผ ์ด์ฉํ ์คํ์ผ ์ ์ฉ
- ์ปดํฌ๋ํธ์์์ ์คํ์ผ ์ ์ฉ
- TodoList ์์
- Angular, React์ ๋นํด ํ์ต๋น์ฉ์ด ์ ์
- MVVM ํจํด (Model - View - ViewModel) : ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง๊ณผ UI์ ๋ถ๋ฆฌ๋ฅผ ์ํด ์ค๊ณ๋ ํจํด
- View๋ HTML/CSS๋ก ์์ฑ / ViewModel์ View์ ์ค์ ๋ ผ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ด๋น
- View๋ ViewModel๋ง ์๊ณ ์์ผ๋ฉด ๋๋ฉฐ, ๋๋จธ์ง๋ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋จ
- ViewModel์ ์ํ ๋ฐ์ดํฐ๋ง ๋ณ๊ฒฝํ๋ฉด ์ฆ์ View์ ๋ฐ์
- ๊ฐ์ DOM์ ์ง์ํ๋ฏ๋ก ์์ฃผ ๋น ๋ฅธ UI ๋๋๋ง ์๋๋ฅผ ์ ๊ณต
* vue.js ์ค์น
1. Node.js ์ค์น - [sudo npm install -g npm]
2. Visual Studio Code ์ค์น - [http://code.visualstudio.com]
- ํ๋ฌ๊ทธ์ธ ์ค์น (cmd + shift + x)
- ํ๋ฌ๊ทธ์ธ ์ข
๋ฅ
- view-in-browser : html ํ์ผ์ ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๋ก ๋ณผ ์ ์์
- vetur : vue.js ์ฝ๋ ๋ฌธ๋ฒ๊ฐ์กฐ, ์ฝ๋ ์๋์์ฑ, ๋๋ฒ๊น
, ๋ฆฐํ
๊ธฐ๋ฅ
- HTML Snippets : HTML ํ๊ทธ ์กฐ๊ฐ์ ๋น ๋ฅด๊ฒ ์์ฑ ๊ฐ๋ฅ
- JS-CSS-HTML Formatters : JS, CSS, HTML ์๋์์ฑ / Ctrl + Space
- Vue 2 Snippet : vue.js 2.0 ์ฝ๋ ์กฐ๊ฐ ์ง์๊ณผ ๋ฌธ๋ฒ ๊ฐ์กฐ ๊ธฐ๋ฅ
- Vue-beautify : vue.js ์ฝ๋ ์ ๋ฆฌ ๋ฐฐ์น ๊ธฐ๋ฅ
- ESLint : ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ์ผ, ๋ฌธ๋ฒ ์ฒดํฌ ๊ธฐ๋ฅ
3. ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ฐ Vue.js devtools ์ค์น - ๋๋ฒ๊น
4. Vue-CLI ์ค์น - [sudo npm install -g yarn @vue/cli]
- ์์ ๋ถ์
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello vue.js</title>
<script src="proxy.php?url=https%3A%2F%2Funpkg.com%2Fvue%402.5.16%2Fdist%2Fvue.js"></script>
</head>
<body>
<div id="simple">
<h2>{{message}}</h2>
</div>
<script type="text/javascript">
var model = {
message: '์ฒซ ๋ฒ์งธ Vue.js ์ฑ์
๋๋ค.'
};
var simple = new Vue({
el: '#simple',
data: model
})
</script>
</body>
</html>
- model ๊ฐ์ฒด : Model (๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง)
- simple ๊ฐ์ฒด : ViewModel(Vue ๊ฐ์ฒด), el(HTML ์์), data(model ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ)
- model(๋ฐ์ดํฐ)๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ทธ ์ฆ์ ๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด๋ HTML(๋ทฐ)์ ๋ฐ์
- {{}} -> ์ฝง์์ผ ํํ์(Mustache Expression)
- MVVM ํจํด
#M(Model)
var model = {
message : "~~"
}
#V(View)
<div id = "simple">
<h2>{{message}}</h2>
</div>
#VM(ViewModel)
var simple = new Vue({
~~
})
View (์ ์ ์ธํฐํ์ด์ค) -> ViewModel(์ํ์ ์ฐ์ฐ) -> Model(๋๋ฉ์ธ ํนํ ๋ฐ์ดํฐ)
๋ฐ์ดํฐ๋ฐ์ธ๋ฉ๊ณผ ์ปค๋งจ๋ ์
๋ฐ์ดํธ
View (์ ์ ์ธํฐํ์ด์ค) <- ViewModel(์ํ์ ์ฐ์ฐ) <- Model(๋๋ฉ์ธ ํนํ ๋ฐ์ดํฐ)
์๋ฆผ ์ ์ก ์๋ฆผ ์ ์ก
-
๊ธฐ๋ณธ ๋๋ ํฐ๋ธ
- v-text, v-html ๋๋ ํฐ๋ธ
- ์ ์ธ์ ๋ ๋๋ง์ ์ํด HTML ์์ ๋ด๋ถ ํ
ํ๋ฆฟ ํํ์(์ฝง์์ผ ํํ์)์ด์ธ์ ๋๋ ํฐ๋ธ๋ผ๋ ๊ฒ์ ์ด์ฉํด ํํํ ์ ์์
- ๋จ๋ฐฉํฅ ๋๋ ํฐ๋ธ (HTML ์์์์ ๊ฐ์ ๋ณ๊ฒฝํ์ฌ๋ ๋ชจ๋ธ ๊ฐ์ฒด์ ๊ฐ์ ์๋ฐ๋)
Before) <h2>{{message}}</h2> After) <h2 v-text="message"></h2>- v-text, {{ }} : innerText ์์ฑ์ ์ฐ๊ฒฐ, ํ๊ทธ ๋ฌธ์์ด์ HTML ์ธ์ฝ๋ฉํ์ฌ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ํ๋ฉด์๋ ํ๊ทธ ๋ฌธ์์ด์ด ๊ทธ๋๋ก ๋ํ๋จ
> model.message = "<i>HTML ํ๊ทธ๋ ์ด์ฐ ๋๋?</i>"; > document.getElementById("simple").innerHTML ->> "<h2><i>HTML ํ๊ทธ๋ ์ด์ฐ ๋๋?</i></h2>" - v-html : innerHTML ์์ฑ์ ์ฐ๊ฒฐ, ๋ฌธ์์ด์ ํ์ฑํ์ฌ ํ๋ฉด์ ๋ํ๋
> model.message = "<i>HTML ํ๊ทธ๋ ์ด์ฐ ๋๋?</i>"; > document.getElementById("simple").innerHTML ->> "<h2><i>HTML ํ๊ทธ๋ ์ด์ฐ ๋๋?</i></h2>" - v-html์ script ํ๊ทธ๋ฅผ ๊ทธ๋๋ก ๋ฐ์ธ๋ฉํ๋ฏ๋ก XSS(Cross Site Scripting) ๊ณต๊ฒฉ์ ์ทจ์ฝํจ, ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด v-text ์ฌ์ฉ์ ๊ถ์ฅ
- v-bind ๋๋ ํฐ๋ธ
- ์์ ๊ฐ์ฒด์ ์ปจํ ํธ ์์ญ์ด ์๋ ์์ฑ๋ค์ ๋ฐ์ธ๋ฉ
- ๋จ๋ฐฉํฅ ๋๋ ํฐ๋ธ (HTML ์์์์ ๊ฐ์ ๋ณ๊ฒฝํ์ฌ๋ ๋ชจ๋ธ ๊ฐ์ฒด์ ๊ฐ์ ์๋ฐ๋)
<input id="a" type="text" v-bind:value="message"> <br/> <img v-bind:src="proxy.php?url=https%3A%2F%2Fgithub.com%2FimagePath" /> <script> var model = { message: 'v-bind ๋๋ ํฐ๋ธ.', imagePath: "http://sample.bmaster.kro.kr/photos/61.jpg" };- v-bind:src์์ v-bind๋ฅผ ์๋ตํ๊ณ :src๋ก ์ฌ์ฉ๊ฐ๋ฅ
- v-model ๋๋ ํฐ๋ธ
- ์๋ฐฉํฅ ๋๋ ํฐ๋ธ : ์์์์ ๋ณ๊ฒฝํ ๊ฐ์ด ๋ชจ๋ธ ๊ฐ์ฒด์ ๋ฐ์์ด ๋จ
<body> <div id="simple1"> <div> ์ข์ํ๋ ๊ณผ์ผ์ ๋ชจ๋ ๊ณจ๋ผ์ฃผ์ธ์. </div> <input type="checkbox" value="1" v-model="fruits"> ์ฌ๊ณผ, <input type="checkbox" value="2" v-model="fruits"> ํค์, <input type="checkbox" value="3" v-model="fruits"> ํฌ๋, <input type="checkbox" value="4" v-model="fruits"> ์๋ฐ, <input type="checkbox" value="5" v-model="fruits"> ์ฐธ์ธ, </div> <div id="simple2"> ์ ํํ ๊ณผ์ผ๋ค : <span v-html="fruits"></span> </div> <script type="text/javascript"> var model = { fruits: [] }; var simple1 = new Vue({ el: '#simple1', data: model }); var simple2 = new Vue({ el: '#simple2', data: model }); </script> </body> </html>- ํ๋์ ๋ชจ๋ธ์ 2๊ฐ์ Vue ๊ฐ์ฒด์์ ์ฐธ์กฐ
- ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ์ ๋ทฐ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํตํด ์ฆ์ ๋ณ๊ฒฝ
- v-model ๋๋ ํฐ๋ธ ์์์ด
- lazy (v-model.lazy="name") : ์ ๋ ฅํผ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋, ์ ๋ ฅํ ๊ฐ์ ๋ฐ์ดํฐ์ ๋๊ธฐํ
- number : ์ซ์๊ฐ ์ ๋ ฅ๋ ๊ฒฝ์ฐ number ํ์ ์ ๊ฐ์ผ๋ก ์๋ ํ๋ณํ
- trim : ๋ฌธ์์ด ์๋ค ๊ณต๋ฐฑ์ ์๋์ ๊ฑฐ
- v-show, v-if, v-else, v-else-if ๋๋ ํฐ๋ธ
- v-if : v-show ๋๋ ํฐ๋ธ์ ๋น์ทํ ๊ธฐ๋ฅ, ๋ ๋๋ง ์ฌ๋ถ ์ฐจ์ด๊ฐ ์์
- v-if ๋๋ ํฐ๋ธ๋ ์กฐ๊ฑด์ ๋ถํฉ๋์ง ์์ผ๋ฉด ๋ ๋๋ง์ ํ์ง ์์
- v-show๋ ์ผ๋จ HTML ์์๋ฅผ ๋ ๋๋ง ํ ํ, display ์คํ์ผ ์์ฑ์ผ๋ก ๋ณด์ฌ์ค์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์
- ๋ฐ๋ผ์, ์์ฃผ ํ๋ฉด์ด ๋ณ๊ฒฝ๋๋ ๋ถ๋ถ์์๋ v-if ๋๋ ํฐ๋ธ๋ณด๋ค๋ v-show ๋๋ ํฐ๋ธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํจ
- ์์
<div id="account"> ์๊ณ : <input type="text" v-model="balance" /> <br/> ํ์ ๋ฑ๊ธ : <span v-if="balance >= 1000000">Gold</span> <span v-else-if="balance >= 500000">Silver</span> <span v-else-if="balance >= 200000">Bronze</span> <span v-else>Basic</span> </div> <script type="text/javascript"> var simple = new Vue({ el: "#account", data: { balance: 0 } }) </script> - v-if : v-show ๋๋ ํฐ๋ธ์ ๋น์ทํ ๊ธฐ๋ฅ, ๋ ๋๋ง ์ฌ๋ถ ์ฐจ์ด๊ฐ ์์
-
๋ฐ๋ณต ๋ ๋๋ง ๋๋ ํฐ๋ธ
- v-for ๋๋ ํฐ๋ธ
- ๋ฐ์ดํฐ๊ฐ ๋ฐฐ์ดํํ
<tr v-for="contact in contacts"></tr> * ๋ง์ฝ ์ธ๋ฑ์คํ ์ด์ฉํ ๊ฒฝ์ฐ <tr v-for="(contact,index) in contacts"></tr>- ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฒดํํ
<tr v-for="(val, key) in contacts"></tr> * ๋ง์ฝ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ <tr v-for="(val, key, index) in contacts"></tr>- v-for, v-if๋ฅผ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฃผ์
- ์ ์ฉ ์์ : v-for ๋๋ ํฐ๋ธ๊ฐ ๋จผ์ ์ํ๋๊ณ v-if๊ฐ ์ ์ฉ๋จ
<tr v-for="contact in contacts" v-if="contact.address.indexOf('์์ธ') > -1"></tr>
- ํ๋์ ์์๊ฐ ์๋, ์ฌ๋ฌ ์์์ ๊ทธ๋ฃน์ ๋ฐ๋ณต ๋ ๋๋งํ๋ ค๋ฉด?
- template ํ๊ทธ๋ฅผ ์ฌ์ฉ
- key ํน์ฑ(Attribute)
- DOM ์์์ ์์น๋ฅผ ์ง์ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ค๋ฉด,
- key ํน์ฑ์ ๊ธฐ๋ณธํค(Primary key) ๊ฐ์ ๋ฐ์ธ๋ฉ
<template v-for="(contact, index) in contacts"> <tr :key="contact.no"> <td>{{contact.no}}></td> <td>{{contact.name}}></td> <td>{{contact.tel}}></td> </tr> </template>- ์ผ๋ฐ์ ์ผ๋ก key ํน์ฑ์ ๋ฐ์ธ๋ฉํ ๊ฒ์ ๊ถ์ฅํ์ง๋ง, ๋ ๋๋ง ์๋๊ฐ ๊ฐ์ ๋๋ค๊ณ ๋งํ ์๋ ์์
- v-for ๋๋ ํฐ๋ธ๋ ์ฃผ๋ก ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ๊ฒ์ธ๋ฐ, ๋ฐฐ์ด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ถ์ ์ด ๋์ง ์๋ ์์
์ด ์์
- ๋ฐฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ธ๋ฑ์ค ๋ฒํธ๋ก ์ง์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ
- ex) list.contact[0] = {no:12, name:"12" ~~~}
- ์ด๋ ๊ฒ ์ฝ์์์ ๋ณ๊ฒฝํด๋ ์๋ฌด๋ณํ๊ฐ ์์
- ํ์ง๋ง ์์ฑ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ, Vue ์ธ์คํด์ค ๋ด๋ถ์ ๊ฐ์์๊ฐ ์ถ์ ํด๋ด๊ธฐ ๋๋ฌธ์ ์ฆ์ ๋ณ๊ฒฝ๋จ (list.contact[0].name = 'js')
- ๊ธฐ์กด์ ๋ฐฐ์ด ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ Vue.set(list.contact, 0, {no:12, name="12"~~~}๋ก ๋ณ๊ฒฝํด์ผํจ
- ๋ฐฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ธ๋ฑ์ค ๋ฒํธ๋ก ์ง์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ
- v-for ๋๋ ํฐ๋ธ
-
๊ธฐํ ๋๋ ํฐ๋ธ
- v-pre : HTML ์์์ ๋ํ ์ปดํ์ผ์ ์ํํ์ง ์์
- v-once : HTML ์์๋ฅผ ๋จ 1๋ฒ๋ง ๋ ๋๋ง (์ฝ์๋ก ๊ฐ์ ๋ณ๊ฒฝํ์ฌ๋ ์๋ฐ๋) - ์ด๊ธฐ๊ฐ์ด ์ฃผ์ด์ง๋ฉด ๋ณ๊ฒฝ๋์ง ์๋ UI๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ ์ ์์
-
๊ณ์ฐํ ์์ฑ
- Vue ๊ฐ์ฒด์ computed ์์ฑ๊ณผ ํจ๊ป ํจ์๋ก ๋ฑ๋กํด๋๋ฉด ๋ง์น ์์ฑ์ฒ๋ผ ์ฌ์ฉํ ์ ์์
<div id="example"> <input type="text" v-model="num" /><br/> 1 ~ n ์ ๋ ฅ๋ ์์ ํฉ : <span>{{sum}}</span> </div> <script type="text/javascript"> var vmSum = new Vue({ el: "#example", data: { num: 0 }, computed: { sum: function() { var n = Number(this.num); if (Number.isNaN(n) || n < 1) return 0; return ((1 + n) * n) / 2; } } }) </script>- ์ฃผ์์ฌํญ
- ํจ์ ๋ด๋ถ์ this
- ํจ์ ์์ this๋ Vue ๊ฐ์ฒด ์์ ์ ์ฐธ์กฐ
- ํจ์ ๋ด๋ถ์์ ๋ค๋ฅธ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ์ ๋ this๊ฐ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ฐ๊ฒฐ๋ ์ ์์ผ๋ฏ๋ก ์ฃผ์
- ๋ฐ์ดํฐ ํ์
- HTML ์์ ๋ด๋ถ์์๋ ๋ชจ๋ ๋ฌธ์์ด๋ก ๋ค๋ฃจ์ด์ง๋ฏ๋ก, Number(), parseInt() ํจ์๋ฅผ ์ด์ฉํด ๋ช ์์ ์ผ๋ก ์ซ์ ๊ฐ์ ๋ณํํด์ฃผ์ด์ผ ํ๋ค.
- ํจ์ ๋ด๋ถ์ this
- el, data, computed ์ต์
- data
- data ์ต์ ์ ์ฃผ์ด์ง ๋ชจ๋ ์์ฑ๋ค์ Vue ์ธ์คํด์ค ๋ด๋ถ์์ ์ง์ ์ด์ฉ๋์ง ์์
- Vue ์ธ์คํด์ค์ Data ์ต์ ์ ์ฃผ์ด์ง ๊ฐ์ฒด ์ฌ์ด์ ํ๋ก์(๋๋ฆฌ์ธ)๋ฅผ ๋์ด ์ฒ๋ฆฌ
- data ์ต์ ์ Vue ์ธ์คํด์ค๊ฐ ๊ด์ฐฐํ๋ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์๋ฏธ (๋ณ๊ฒฝ์ฌํญ์ ์ฆ์ ๊ฐ์ง)
- vm.$data.name
- el
- Vue ์ธ์คํด์ค์ ์ฐ๊ฒฐํ HTML DOM ์์๋ฅผ ์ง์
- ์ฌ๋ฌ ๊ฐ ์์์ ์ง์ ํ ์ ์์
- el ์ต์ ์ Vue ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ ๋ฏธ๋ฆฌ ์ง์ ํ ๊ฒ์ ๊ถ์ฅ
- Vue ์ธ์คํด์ค๊ฐ HTML ์์์ ์ฐ๊ฒฐ๋๋ฉด ๋์ค์ ์ฐ๊ฒฐ๋ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์์
- computed
- ์ด ์ต์ ์์ ์ง์ ํ ๊ฐ์ ํจ์์์ง๋ง, Vue ์ธ์คํด์ค๋ ํ๋ก์ ์ฒ๋ฆฌํ์ฌ ๋ง์น ์์ฑ์ฒ๋ผ ์ทจ๊ธ
- vm.$options.computed.sum
- get / set function
- ๋ฉ์๋
- Vue ์ธ์คํด์ค์์ ์ฌ์ฉํ ๋ฉ์๋๋ฅผ ๋ฑ๋กํ๋ ์ต์
- Vue ์ธ์คํด์ค๋ฅผ ์ด์ฉํด ์ง์ ํธ์ถํ๊ฑฐ๋, ๋๋ ํฐ๋ธ ํํ์, ์ฝง์์ผ ํํ์์ผ๋ก ์ฌ์ฉ
<input type="text" v-model="num"/> 1๋ถํฐ ์ ๋ ฅ๋์์ ํฉ : <span>{{sum()}}</span> var vm = new Vue({ el : "#example", data : { num : 0}, methods : { sum : function() { var n = Number(this.num); if(Number.isNaN(n) || n<1) return 0; return ((1+n) * n) / 2; } } }) - ๊ณ์ฐํ ์์ฑ๊ณผ ๋ฉ์๋์ ์ฐจ์ด
- ์ต์ข ์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์ ๊ฐ์๋ณด์ด์ง๋ง, ๋ด๋ถ ์๋ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์
- ๊ณ์ฐํ ์์ฑ์ ์ข ์๋ ๊ฐ์ ์ํด ๊ฒฐ๊ณผ๊ฐ์ด ์บ์ฑ์ด ๋จ
- ๋ฐ๋ผ์, vm.num์ด ๊ฐ์ ๊ฐ์ด ๋ค์ด์์ ๋, ๊ณ์ฐํ ์์ฑ์ ๊ฐ์ ๋ฐ๋ก ๋ฆฌํดํ์ง๋ง, ๋ฉ์๋๋ ๋งค๋ฒ ์ํ
- ๋ฉ์๋ ์์ฑ ์ ์ฃผ์ํ ์
- ECMAScript6๊ฐ ์ ๊ณตํ๋ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํด์๋ ์๋จ
- Arrow function(ํ์ดํ ํจ์)์ function ํค์๋ ๋์ ํ์ดํ(=>)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ตํ ๋ฐฉ๋ฒ์ผ๋ก ํจ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ
- ํ์ดํ ํจ์ ๋ด๋ถ์์๋ this๊ฐ Vue ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค์ง ์๊ณ , ์ ์ญ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํด
- ๋ฉ์๋ ๋ด๋ถ์์๋ ๋ณดํต ๋ฐ์ดํฐ ์์ฑ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ this๊ฐ ๋ฐ๋๋ฉด Vue ์ธ์คํด์ค ๋ด๋ถ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์
- ECMAScript6๊ฐ ์ ๊ณตํ๋ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํด์๋ ์๋จ
- ๊ด์ฐฐ ์์ฑ
- ๊ณ์ฐํ ์์ฑ : ํ๋์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ๋ ์ฌ์ฉ
- ๊ด์ฐฐ ์์ฑ : ์ฃผ๋ก ๊ธด ์ฒ๋ฆฌ ์๊ฐ์ด ํ์ํ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ ํฉํ๋ค๋ ํน์ง์ ๊ฐ์ง
<body> <div id="example"> x : <input type="text" v-model="x" /> <br/> y : <input type="text" v-model="y" /> <br/> ๋ง์ ๊ฒฐ๊ณผ : {{sum}} </div> <script type="text/javascript"> var vm = new Vue({ el: "#example", data: { x: 0, y: 0, sum: 0 }, watch: { x: function(v) { console.log("## x ๋ณ๊ฒฝ"); var result = Number(v) + Number(this.y); if (isNaN(result)) this.sum = 0; else this.sum = result; }, y: function(v) { console.log("## y ๋ณ๊ฒฝ"); this.y = v; var result = Number(this.x) + Number(v); if (isNaN(result)) this.sum = 0; else this.sum = result; } } }) </script> </body> - function(v) {...}๋ x์์ฑ ๋๋ y์์ฑ์ด ๋ณ๊ฒฝ๋ ๋ ํธ์ถ๋๋ ํจ์
- ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ๋งค๋ฒ ํจ์๊ฐ ํธ์ถ๋๋ค๋ ๋จ์ ์ด ์์
- ์ด๋ฐ ๊ฒฝ์ฐ ๊ณ์ฐํ ์์ฑ์ด ๋ ํจ๊ณผ์ ์
<body> <div id="example"> x : <input type="text" v-model="x" /> <br/> y : <input type="text" v-model="y" /> <br/> ๋ง์ ๊ฒฐ๊ณผ : {{sum}} </div> <script type="text/javascript"> var vm = new Vue({ el: "#example", data: { x: 0, y: 0 }, computed: { sum: function() { var result = Number(this.x) + Number(this.y); if (isNaN(result)) return 0; else return result; } } }) </script> </body> - ์ด๋ ๊ฒ ์์ฑํ๋ฉด sum์ด ์ฐธ์กฐ๋ ๋๋ง ํด๋น ํจ์๊ฐ ํธ์ถ
- ๊ทธ๋ ๋ค๋ฉด ์ธ์ ๊ด์ฐฐ ์์ฑ์ด ์ ์ฉํ ๊น?
- ๊ธด ์๊ฐ์ด ํ์ํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋
- ๊ฐ์ฅ ๋ํ์ ์ธ ์๋ ์ธ๋ถ ์๋ฒ์์ ํต์ ๊ธฐ๋ฅ
- wath_Asynchronous(4) ์์ ์ฐธ๊ณ
- ์ด ์์ ๋ ๊ณ์ฐํ ์์ฑ์ผ๋ก ๊ตฌํํ ์ ์์
- ๊ณ์ฐํ ์์ฑ์ ๊ฐ์ ๋ฆฌํดํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๊ธฐ์ ์ฒ๋ฆฌ๋ง ์ํ์ด ๊ฐ๋ฅํจ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ๊ด์ฐฐ ์์ฑ์ด๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ์ฉ
- v-cloak ๋๋ ํฐ๋ธ
- ๋ง์ฝ์ ํ ํ๋ฆฟ์ ๋จธ์คํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋๋ผ๋ฉด ๋จธ์คํ์ฌ ํ๊ทธ๊ฐ ๊ทธ๋๋ก ๋ํ๋ฌ์๊ฒ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ ๋๊ธฐ์ ์ฆ, Vue ์ธ์คํด์ค๊ฐ ์ ๋๋ก ์ค๋น๋๊ธฐ ์ ๊น์ง ์ฐ๋ฆฌ์ ํ ํ๋ ์ ์ํ HTML ์ฝ๋๋ฅผ ์จ๊ธฐ๊ณ ์ถ์ ๋ ์ฌ์ฉ
- Vue ์ธ์คํด์ค ๋ผ์ดํ ์ฌ์ดํด
- Vue ์ธ์คํด์ค๋ ๊ฐ์ฒด๋ก ์์ฑ๋๊ณ , ๋ฐ์ดํฐ์ ๋ํ ๊ด์ฐฐ ๊ธฐ๋ฅ์ ์ค์ ํ๋ ๋ฑ์ ์์ ์ ์ํด ์ด๊ธฐํ๋ฅผ ์ํ
- ๋ค์ํ ๋ผ์ดํ ์ฌ์ดํด ํ ๋ฉ์๋๋ฅผ ์ ์ฉํ ์ ์์
- Vue ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌํ ๋ ๊ฝค ์ ์ฉ
- ๋ผ์ดํ ์ฌ์ดํด ํ
- beforeCreate : Vue ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ๋ฐ์ดํฐ์ ๋ํ ๊ด์ฐฐ ๊ธฐ๋ฅ ๋ฐ ์ด๋ฒคํธ ๊ฐ์์ ์ค์ ์ ์ ํธ์ถ๋จ
- created : Vue ์ธ์คํด์ค๊ฐ ์์ฑ๋ ํ์ ๋ฐ์ดํฐ์ ๋ํ ๊ด์ฐฐ ๊ธฐ๋ฅ, ๊ณ์ฐํ ์์ฑ, ๋ฉ์๋, ๊ฐ์์ ์ค์ ์ด ์๋ฃ๋ ํ์ ํธ์ถ
- beforeMount : ๋ง์ดํธ๊ฐ ์์๋๊ธฐ ์ ์ ํธ์ถ
- mounted : el์ vue ์ธ์คํด์ค์ ๋ฐ์ดํฐ๊ฐ ๋ง์ดํธ ๋ ํ์ ํธ์ถ
- beforeUpdate : ๊ฐ์ DOM์ด ๋ ๋๋ง, ํด์น๋๊ธฐ ์ ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ํธ์ถ, ์ด ํ ์์ ์ถ๊ฐ์ ์ธ ์ํ ๋ณ๊ฒฝ์ ์ํํ ์ ์์, ํ์ง๋ง ์ถ๊ฐ๋ก ๋ค์ ๋ ๋๋ง์ ํ์ง๋ ์์
- updated : ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ผ๋ก ๊ฐ์ DOM์ด ๋ค์ ๋ ๋๋ง๋๊ณ ํจ์น๋ ํ์ ํธ์ถ, ์ด ํ ์ ํธ์ถ๋์์ ๋๋ ์ด๋ฏธ ์ปดํฌ๋ํธ DOM์ด ์ ๋ฐ์ดํธ๊ฐ๋ ์ํ, DOM์ ์ข ์์ฑ์ด ์๋ ์ฐ์ฐ์ ์ด ๋จ๊ณ์์ ์ํํ ์ ์์
- beforeDestroy : Vue ์ธ์คํด์ค๊ฐ ์ ๊ฑฐ๋๊ธฐ ์ ์ ํธ์ถ
- destroyed : Vue ์ธ์คํด์ค๊ฐ ์ ๊ฑฐ๋ ํ์ ํธ์ถ, ์ด ํ ์ด ํธ์ถ๋ ๋๋ Vue ์ธ์คํด์ค์ ๋ชจ๋ ๋๋ ํฐ๋ธ์ ๋ฐ์ธ๋ฉ์ด ํด์ ๋๊ณ , ์ด๋ฒคํธ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ ๊ฑฐ๋จ
- ์ธ๋ผ์ธ ์ด๋ฒคํธ ์ฒ๋ฆฌ
- ์ด๋ฒคํธ๋ v-on ๋๋ ํฐ๋ธ๋ฅผ ์ด์ฉํด์ ์ฒ๋ฆฌ
- Click ์ด๋ฒคํธ๋ฅผ ๊ฐ์ฅ ๋ง์ด ์
v-on:click="balance += parseInt(amount)"
- v-on ๋๋ ํฐ๋ธ๋ @๋ก ์ค์ฌ์ธ ์ ์์
@click="balance += parseInt(amount)"
- Vue ์ธ์คํด์ค์ ๋ฑ๋กํ ๋ฉ์๋๋ฅผ ์ด๋ฒคํธ ์ฒ๋ฆฌ ํจ์๋ก ์ฐ๊ฒฐํ ์ ์์
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฉ์๋
- ๋ณต์กํ ๊ธฐ๋ฅ์ ๋ฉ์๋๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด๋๊ณ , v-on ๋๋ ํฐ๋ธ๋ก ์ฐธ์กฐํด์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ํ
<button id="deposit" v-on:click="deposit" class="btn btn-primary">์๊ธ</button>
<button id="withdraw" v-on:click="withdraw" class="btn btn-primary">์ธ์ถ</button>
<script type="text/javascript">
var vm = new Vue({
el: "#example",
data: {
amount: 0,
balance: 0
},
methods: {
deposit: function(e) {
var amt = parseInt(this.amount);
if (amt < 0) {
alert('0์๋ณด๋ค ํฐ ๊ฐ์ ๋ฃ์ด์ฃผ์ธ์');
} else {
this.balance += amt;
}
},
withdraw: function(e) {
var amt = parseInt(this.amount);
if (amt <= 0) {
alert('0๋ณด๋ค ํฐ ๊ฐ์ ์ธ์ถํ ์ ์์ต๋๋ค');
} else if (amt > this.balance) {
alert('์๊ณ ๋ณด๋ค ๋ง์ ๊ธ์ก์ ์ธ์ถํ ์ ์์ต๋๋ค.')
} else {
this.balance -= amt;
}
},
}
})
</script>
- ์ด๋ฒคํธ ๊ฐ์ฒด
- ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ ํ๋ ๊ฐ์ฒด๋ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ์
deposit: function(e) {~~}
withdraw: function(e) {~~}
- ์ด๋ฒคํธ ๊ฐ์ฒด(e)๋ฅผ ํตํด ์ด์ฉํ ์ ์๋ ์ ๋ณด๊ฐ ๋ง์
- ์ด๋ฒคํธ ๊ฐ์ฒด ์ ๋ณด
- ๊ธฐ๋ณธ ์ด๋ฒคํธ
- HTML ๋ฌธ์๋ ์์์ ์ด๋ค ๊ธฐ๋ฅ์ ์คํํ๋๋ก ์ด๋ฏธ ์ ์๋์ด ์๋ ์ด๋ฒคํธ
- a ํ๊ทธ ์์๋ฅผ ํด๋ฆญํ์ ๋, href ํน์ฑ์ ๊ฒฝ๋ก๋ก ํ์ด์ง ์ด๋
- ๋ธ๋ผ์ฐ์ ํ๋ฉด ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ํด๋ฆญํ๋ฉด ๋ด์ฅ ์ปจํ ์คํธ ๋ฉ๋ด๊ฐ ๋ํ๋จ
- ํผ ํ๊ทธ ์์ ๋ด๋ถ์ submit ๋ฒํผ์ ํด๋ฆญํ์ ๋, action ํน์ฑ์ ์ง์ ๋ ๊ฒฝ๋ก๋ก method ํน์ฑ์ ์ง์ ๋ ๋ฐฉ์์ผ๋ก ์ ์ก
- input ํ์ text ์์์ ํค๋ณด๋๋ฅผ ๋๋ฅด๋ฉด ์ ๋ ฅํ ๋ฌธ์๊ฐ ํ ์คํธ ๋ฐ์ค์ ๋ํ๋จ
- ๋ฑ๋ฑ..
- ๊ธฐ๋ณธ ์ด๋ฒคํธ์ ์คํ์ ๋ง๋ ๋ฐฉ๋ฒ
<div id="example" v-on:contextmenu="ctxStop"> <a href="proxy.php?url=https%3A%2F%2Ffacebook.com" @click="confirmFB">ํ์ด์ค๋ถ</a> </div> methods: { ctxStop: function(e) { e.preventDefault(); }, confirmFB: function(e) { if (!confirm('ํ์ด์ค๋ถ์ผ๋ก ์ด๋ํ ๊น์?')) { e.preventDefault(); } } }- ์ต๊ทผ์ ๊ธฐ๋ณธ ์ด๋ฒคํธ์ ์คํ์ ๋ง๋ ์ฃผ๋ ์ด์ ๋ ๋ธ๋ผ์ฐ์ ํ๋ฉด์์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ์ ํด๋ฆญํ ๋, ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ ๋ฉ๋ด๋ฅผ ๋ํ๋ด๊ธฐ ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง์
- ํ์ง๋ง ๋งค๋ฒ ๊ฐ๋ฐ์๊ฐ e.preventDefault()๋ฅผ ์ ๊ฒฝ์ฐ๊ธฐ๋ ์ฝ์ง ์์
* ์๋์ฒ๋ผ ์์ฑํ๋ฉด e.preventDefault()๋ฅผ ์์จ๋๋์ง๋ง, ์กฐ๊ฑด ๋ ผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ํธ์ถ์ผ ๊ฒฝ์ฐ๋ ์จ์ค์ผํ๋ค. <div id="example" v-on:contextmenu.prevent="ctxStop"> </div>
- ์ด๋ฒคํธ ์ ํ์ ๋ฒ๋ธ๋ง
- HTML ๋ฌธ์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ 3๋จ๊ณ๋ฅผ ๊ฑฐ์นจ
- 1๋จ๊ณ : ์ด๋ฒคํธ ํฌ์ฐฉ ๋จ๊ณ(CAPTURING_PHASE)
- ๋ฌธ์ ๋ด ์์ ๋๋ ๋ฌธ์ ๋ฐ์์๋ถํฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ HTML ์์๊น์ง ํฌ์ฐฉ
- 2๋จ๊ณ : ์ด๋ฒคํธ ๋ฐ์ ๋จ๊ณ(RAISING_PHASE : AT_TARGET)
- ์์์ ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ํจ์๋ฅผ ์ง์ ํธ์ถ
- 3๋จ๊ฒ : ๋ฒ๋ธ๋ง(BUBBLING_PHASE) ๋จ๊ณ
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๋ก๋ถํฐ ์์ ์์๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉด์ ๋์ผํ ์ด๋ฒคํธ๋ฅผ ํธ์ถ
- ์ผ๋ฐ์ ์ผ๋ก 2๋จ๊ณ, 3๋จ๊ณ์์ ์ฐ๊ฒฐ๋ ์ด๋ฒคํธ ํจ์๊ฐ ํธ์ถ
์์ ) <div id="example"> <div id="outer" @click="outerClick"> <div id="inner" @click="innerClick"></div> </div> </div> methods: { outerClick: function(e) { console.log("### outer click"); console.log("Event phase : ", e.eventPhase); console.log("Current target : ", e.currentTarget); console.log("Target : ", e.target); }, innerClick: function(e) { console.log("### inner click"); console.log("Event phase : ", e.eventPhase); console.log("Current target : ", e.currentTarget); console.log("Target : ", e.target); } }- #inner ํด๋ฆญํ๋ฉด #inner, #outer click ์ด๋ฒคํธ ๋ชจ๋ ๋ฐ์
- #outer ํด๋ฆญํ๋ฉด #outer click ์ด๋ฒคํธ๋ง ๋ฐ์
- BUBBLING_PHASE์ผ ๋์ RAISING_PHASE์ผ ๋ ์ ๋ณด๊ฐ ๋ค๋ฆ
- ์ฆ, currentTarget๊ณผ target ๊ฐ์ด ์๋ก ๋ค๋ฆ
- ๋ฒ๋ธ๋ง ๋จ๊ณ์์์ target์ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ ์๋ณธ ์์
- ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ ๋ง์์ผํ๋ค (#inner ํด๋ฆญํ์ ๋ ์์ ์์๋ก์ ์ด๋ฒคํธ ์ ํ)
- stopPropagation() ๋ฉ์๋๋ฅผ ํธ์ถํด์ ๋ง์ ์ ์์
methods: { outerClick: function(e) { e.stopPropagation(); }, innerClick: function(e) { e.stopPropagation(); } } })- ๋๋ ์ด๋ฒคํธ ์์์ด๋ก ๋์ฒดํ ์ ์์
- .stop : ์ด๋ฒคํธ ์ ํ๋ฅผ ์ค๋จ
@click.stop="outerClick" @click.stop="innerClick" - .capture : CAPTURING_PHASE ๋จ๊ณ์์๋ง ์ด๋ฒคํธ๊ฐ ๋ฐ์
* ์ ์ฝ๋๋ค๊ณผ ๋ค๋ฅธ ๊ธฐ๋ฅ @click.capture.stop="outerClick" @click.stop="innerClick" -> #inner ํด๋ฆญํ๋๋ผ๋ CAPTURING_PHASE์์ outerClick์ด ํธ์ถ๋๊ณ ๋์ ์ฆ์ stop ์ฆ, ์ด๋ฒคํธ ํฌ์ฐฉ(capture) ๋จ๊ณ์์ ์ ํ๋ฅผ ์ค์ง (outerClick๋ง ํธ์ถ๋๊ณ ๋ ์ด์ ์ด๋ฒคํธ ๋ฐ์์ ์ผ์ด๋์ง ์์) - .self : RAISING_PHASE ๋จ๊ณ์ผ ๋๋ง ์ด๋ฒคํธ๊ฐ ๋ฐ์
- .stop : ์ด๋ฒคํธ ์ ํ๋ฅผ ์ค๋จ
- 1๋จ๊ณ : ์ด๋ฒคํธ ํฌ์ฐฉ ๋จ๊ณ(CAPTURING_PHASE)
- ์ด๋ฒคํธ ์์์ด
- once ์์์ด : ํ ๋ฒ๋ง ์ด๋ฒคํธ๋ฅผ ๋ฐ์
v-on:click.once="method" - ํค์ฝ๋ ์์์ด : ํค๋ณด๋ ๊ด๋ จ ์ด๋ฒคํธ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ ์ ์๋ ์์์ด
13(enter) v-on:keyup.13="search" methods : { search :function(e) { ~~~ } } - ๋ง์ฐ์ค ๋ฒํผ ์์์ด (.left, .right, .middle)
<div id="example" v-on:contextmenu.prevent="method" @mouseup.left="leftMethod" @mouseup.right="rightMethod">
- ์คํ์ผ ์ ์ฉ
- ์ธ๋ผ์ธ ์คํ์ผ
- CSS ํด๋์ค ๋ฐ์ธ๋ฉ
- ๊ณ์ฐํ ์์ฑ, ๋ฉ์๋๋ฅผ ์ด์ฉํ ์คํ์ผ ์ ์ฉ
- ์ปดํฌ๋ํธ์์์ ์คํ์ผ ์ ์ฉ
- TodoList ์์
- ์ปดํฌ๋ํธ ์กฐํฉ
- ์ปดํฌ๋ํธ์ ์์ฑ
- DOM ํ ํ๋ฆฟ ๊ตฌ๋ฌธ ์์ฑ ์ ์ฃผ์ ์ฌํญ
- ์ปดํฌ๋ํธ์์์ data ์ต์
- props์ event
- props๋ฅผ ์ด์ฉํ ์ ๋ณด ์ ๋ฌ
- event๋ฅผ ์ด์ฉํ ์ ๋ณด ์ ๋ฌ
- props์ event ์์
- ์ด๋ฒคํธ ๋ฒ์ค ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ํต์
- TodoList ์ค์ ์์
- ES2015๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํ๋ก์ ํธ ์ค์
- let๊ณผ const
- ๊ธฐ๋ณธ ํ๋ผ๋ฏธํฐ์ ๊ฐ๋ณ ํ๋ผ๋ฏธํฐ
- ๊ตฌ์กฐ๋ถํด ํ ๋น(destructuring assignment)
- ํ์ดํ ํจ์(Arrow function)
- ์๋ก์ด ๊ฐ์ฒด ๋ฆฌํฐ๋ด
- ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด
- ์ปฌ๋ ์
- ํด๋์ค
- ๋ชจ๋
- Promise
- ์ ๊ฐ ์ฐ์ฐ์(Spread Operator)
- Vue CLI์ ๊ตฌ์ฑ์์์ ์ค์น
- ํ๋ก์ ํธ ์์ฑ๊ณผ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
- ํ๋ก์ ํธ ์์ฑ
- ๋ช ๋ น์ด ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
- vue-cli-service
- ํ๋ฌ๊ทธ์ธ
- vue.config.js
- Vue CLI GUI ๋๊ตฌ
- ๋จ์ผ ํ์ผ ์ปดํฌ๋ํธ
- ์ปดํฌ๋ํธ์์์ ์คํ์ผ
- ๋ฒ์ CSS(Scoped CSS)
- CSS ๋ชจ๋(CSS Module)
- ์ฌ๋กฏ
- ์ฌ๋กฏ์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
- ๋ช ๋ช ๋ ์ฌ๋กฏ
- ๋ฒ์ ์ฌ๋กฏ
- ๋์ ์ปดํฌ๋ํธ
- ์ฌ๊ท ์ปดํฌ๋ํธ
- ์๋น์ค API ์๊ฐ
- axios ๊ธฐ๋ฅ ํ ์คํธ
- http ํ๋ก์ ์ค์
- axios ์ฌ์ฉ
- axios ์์ฒญ ๋ฐฉ๋ฒ
- axios ์๋ต ํ์
- ๊ธฐํ ๋ฉ์๋
- ํ์ผ ์ ๋ก๋ ์ฒ๋ฆฌ
- axios ์์ฒญ๊ณผ config ์ต์
- Vue ์ธ์คํด์ค์์ axios ์ด์ฉํ๊ธฐ
- axios ์ฌ์ฉ ์ ์ฃผ์ ์ฌํญ
- ์ฐ๋ฝ์ฒ ์ ํ๋ฆฌ์ผ์ด์ ์์
- ๊ธฐ์ด ์์
- App.vue ์์ฑ
- ContactList.vue ์์ฑ
- ์ ๋ ฅํผ, ์์ ํผ ์์ฑ
- ์ฌ์ง ๋ณ๊ฒฝํผ ์์ฑ
- ์ ๋ฆฌ