Skip to content

shk3029/Vue.js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

23 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

QuickStartVueJs (2019/2/10 ~)

  • Part1. ์‹œ์ž‘ํ•˜๊ธฐ
    • Vue.js ๋ž€?
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •
  • Part2. Vue.js ๊ธฐ์ดˆ
    • ๊ธฐ๋ณธ ๋””๋ ‰ํ‹ฐ๋ธŒ
    • ๋ฐ˜๋ณต ๋ Œ๋”๋ง ๋””๋ ‰ํ‹ฐ๋ธŒ
    • ๊ธฐํƒ€ ๋””๋ ‰ํ‹ฐ๋ธŒ
    • ๊ณ„์‚ฐํ˜• ์†์„ฑ
  • Part3. Vue ์ธ์Šคํ„ด์Šค
    • el, data, computed ์˜ต์…˜
    • ๋ฉ”์„œ๋“œ
    • ๊ด€์ฐฐ ์†์„ฑ
    • v-cloak ๋””๋ ‰ํ‹ฐ๋ธŒ
    • Vue ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„ ์‚ฌ์ดํด
  • Part4. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
    • ์ธ๋ผ์ธ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
    • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ
    • ์ด๋ฒคํŠธ ๊ฐ์ฒด
    • ๊ธฐ๋ณธ ์ด๋ฒคํŠธ
    • ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ๋ฒ„๋ธ”๋ง
    • ์ด๋ฒคํŠธ ์ˆ˜์‹์–ด
      • once ์ˆ˜์‹์–ด
      • ํ‚ค์ฝ”๋“œ ์ˆ˜์‹์–ด
      • ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ ์ˆ˜์‹์–ด
  • Part5.์Šคํƒ€์ผ
    • ์Šคํƒ€์ผ ์ ์šฉ
    • ์ธ๋ผ์ธ ์Šคํƒ€์ผ
    • CSS ํด๋ž˜์Šค ๋ฐ”์ธ๋”ฉ
    • ๊ณ„์‚ฐํ˜• ์†์„ฑ, ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ ์Šคํƒ€์ผ ์ ์šฉ
    • ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ ์Šคํƒ€์ผ ์ ์šฉ
    • TodoList ์˜ˆ์ œ

Part1

Part1. Vue.js?

  • 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]

Part2

Part2. Vue.js ๊ธฐ์ดˆ

  1. ์˜ˆ์ œ ๋ถ„์„
<!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(๋„๋ฉ”์ธ ํŠนํ™” ๋ฐ์ดํ„ฐ)
                    ์•Œ๋ฆผ ์ „์†ก                      ์•Œ๋ฆผ ์ „์†ก

  1. ๊ธฐ๋ณธ ๋””๋ ‰ํ‹ฐ๋ธŒ

    • 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>&lt;i&gt;HTML ํƒœ๊ทธ๋Š” ์–ด์ฐŒ ๋˜๋‚˜?&lt;/i&gt;</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 ๋””๋ ‰ํ‹ฐ๋ธŒ
      1. v-if : v-show ๋””๋ ‰ํ‹ฐ๋ธŒ์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ, ๋ Œ๋”๋ง ์—ฌ๋ถ€ ์ฐจ์ด๊ฐ€ ์žˆ์Œ
        • v-if ๋””๋ ‰ํ‹ฐ๋ธŒ๋Š” ์กฐ๊ฑด์— ๋ถ€ํ•ฉ๋˜์ง€ ์•Š์œผ๋ฉด ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š์Œ
        • v-show๋Š” ์ผ๋‹จ HTML ์š”์†Œ๋ฅผ ๋ Œ๋”๋ง ํ•œ ํ›„, display ์Šคํƒ€์ผ ์†์„ฑ์œผ๋กœ ๋ณด์—ฌ์ค„์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •
        • ๋”ฐ๋ผ์„œ, ์ž์ฃผ ํ™”๋ฉด์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋ถ€๋ถ„์—์„œ๋Š” v-if ๋””๋ ‰ํ‹ฐ๋ธŒ๋ณด๋‹ค๋Š” v-show ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•จ
      2. ์˜ˆ์ œ
       <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>
      
  2. ๋ฐ˜๋ณต ๋ Œ๋”๋ง ๋””๋ ‰ํ‹ฐ๋ธŒ

    • v-for ๋””๋ ‰ํ‹ฐ๋ธŒ
      1. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฐ์—ดํ˜•ํƒœ
       <tr v-for="contact in contacts"></tr>
       * ๋งŒ์•ฝ ์ธ๋ฑ์Šคํ‹€ ์ด์šฉํ•  ๊ฒฝ์šฐ
       <tr v-for="(contact,index) in contacts"></tr>
      
      1. ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ์ฒดํ˜•ํƒœ
       <tr v-for="(val, key) in contacts"></tr>
       * ๋งŒ์•ฝ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ
       <tr v-for="(val, key, index) in contacts"></tr>
      
      1. 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 ๋””๋ ‰ํ‹ฐ๋ธŒ๋Š” ์ฃผ๋กœ ๋ฐฐ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•  ๊ฒƒ์ธ๋ฐ, ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ถ”์ ์ด ๋˜์ง€ ์•Š๋Š” ์ž‘์—…์ด ์žˆ์Œ
        1. ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋กœ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ
          • ex) list.contact[0] = {no:12, name:"12" ~~~}
          • ์ด๋ ‡๊ฒŒ ์ฝ˜์†”์—์„œ ๋ณ€๊ฒฝํ•ด๋„ ์•„๋ฌด๋ณ€ํ™”๊ฐ€ ์—†์Œ
          • ํ•˜์ง€๋งŒ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ, Vue ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€์˜ ๊ฐ์‹œ์ž๊ฐ€ ์ถ”์ ํ•ด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์ฆ‰์‹œ ๋ณ€๊ฒฝ๋จ (list.contact[0].name = 'js')
          • ๊ธฐ์กด์˜ ๋ฐฐ์—ด ๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Vue.set(list.contact, 0, {no:12, name="12"~~~}๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•จ
  3. ๊ธฐํƒ€ ๋””๋ ‰ํ‹ฐ๋ธŒ

    • v-pre : HTML ์š”์†Œ์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ
    • v-once : HTML ์š”์†Œ๋ฅผ ๋‹จ 1๋ฒˆ๋งŒ ๋ Œ๋”๋ง (์ฝ˜์†”๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ๋„ ์•ˆ๋ฐ”๋€œ) - ์ดˆ๊ธฐ๊ฐ’์ด ์ฃผ์–ด์ง€๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” UI๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  4. ๊ณ„์‚ฐํ˜• ์†์„ฑ

    • 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>
    
    • ์ฃผ์˜์‚ฌํ•ญ
      1. ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ this
        • ํ•จ์ˆ˜ ์•ˆ์˜ this๋Š” Vue ๊ฐ์ฒด ์ž์‹ ์„ ์ฐธ์กฐ
        • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ this๊ฐ€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜
      2. ๋ฐ์ดํ„ฐ ํƒ€์ž…
        • HTML ์š”์†Œ ๋‚ด๋ถ€์—์„œ๋Š” ๋ชจ๋‘ ๋ฌธ์ž์—ด๋กœ ๋‹ค๋ฃจ์–ด์ง€๋ฏ€๋กœ, Number(), parseInt() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ˆซ์ž ๊ฐ’์„ ๋ณ€ํ™˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Part3

Part3. Vue ์ธ์Šคํ„ด์Šค

  1. 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
  1. ๋ฉ”์„œ๋“œ
  • 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 ์ธ์Šคํ„ด์Šค ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ
  1. ๊ด€์ฐฐ ์†์„ฑ
  • ๊ณ„์‚ฐํ˜• ์†์„ฑ : ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
  • ๊ด€์ฐฐ ์†์„ฑ : ์ฃผ๋กœ ๊ธด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ํ•„์š”ํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง
    <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) ์˜ˆ์ œ ์ฐธ๊ณ 
    • ์ด ์˜ˆ์ œ๋Š” ๊ณ„์‚ฐํ˜• ์†์„ฑ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Œ
    • ๊ณ„์‚ฐํ˜• ์†์„ฑ์€ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋งŒ ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•จ
    • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ด€์ฐฐ ์†์„ฑ์ด๋‚˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ ์šฉ
  1. v-cloak ๋””๋ ‰ํ‹ฐ๋ธŒ
  • ๋งŒ์•ฝ์— ํ…œํ”Œ๋ฆฟ์— ๋จธ์Šคํƒœ์‰ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋”๋ผ๋ฉด ๋จธ์Šคํƒœ์‰ฌ ํƒœ๊ทธ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚˜ํƒ€๋‚ฌ์„๊ฒ๋‹ˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰ ๋˜๊ธฐ์ „ ์ฆ‰, Vue ์ธ์Šคํ„ด์Šค๊ฐ€ ์ œ๋Œ€๋กœ ์ค€๋น„๋˜๊ธฐ ์ „ ๊นŒ์ง€ ์šฐ๋ฆฌ์˜ ํ…œํ”Œ๋ ›์„ ์œ„ํ•œ HTML ์ฝ”๋“œ๋ฅผ ์ˆจ๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ
  1. Vue ์ธ์Šคํ„ด์Šค ๋ผ์ดํ”„ ์‚ฌ์ดํด
  • Vue ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ์ฒด๋กœ ์ƒ์„ฑ๋˜๊ณ , ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ด€์ฐฐ ๊ธฐ๋Šฅ์„ ์„ค์ •ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์œ„ํ•ด ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰
  • ๋‹ค์–‘ํ•œ ๋ผ์ดํ”„ ์‚ฌ์ดํด ํ›… ๋ฉ”์„œ๋“œ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • Vue ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ• ๋•Œ ๊ฝค ์œ ์šฉ
  • ๋ผ์ดํ”„ ์‚ฌ์ดํด ํ›…
    • beforeCreate : Vue ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ด€์ฐฐ ๊ธฐ๋Šฅ ๋ฐ ์ด๋ฒคํŠธ ๊ฐ์‹œ์ž ์„ค์ • ์ „์— ํ˜ธ์ถœ๋จ
    • created : Vue ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ ํ›„์— ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ด€์ฐฐ ๊ธฐ๋Šฅ, ๊ณ„์‚ฐํ˜• ์†์„ฑ, ๋ฉ”์„œ๋“œ, ๊ฐ์‹œ์ž ์„ค์ •์ด ์™„๋ฃŒ๋œ ํ›„์— ํ˜ธ์ถœ
    • beforeMount : ๋งˆ์šดํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ
    • mounted : el์— vue ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งˆ์šดํŠธ ๋œ ํ›„์— ํ˜ธ์ถœ
    • beforeUpdate : ๊ฐ€์ƒ DOM์ด ๋ Œ๋”๋ง, ํ•ด์น˜๋˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ, ์ด ํ›…์—์„œ ์ถ”๊ฐ€์ ์ธ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ, ํ•˜์ง€๋งŒ ์ถ”๊ฐ€๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ํ•˜์ง€๋Š” ์•Š์Œ
    • updated : ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ๊ฐ€์ƒ DOM์ด ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๊ณ  ํŒจ์น˜๋œ ํ›„์— ํ˜ธ์ถœ, ์ด ํ›…์€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ๋Š” ์ด๋ฏธ ์ปดํฌ๋„ŒํŠธ DOM์ด ์—…๋ฐ์ดํŠธ๊ฐ€๋œ ์ƒํƒœ, DOM์— ์ข…์†์„ฑ์ด ์žˆ๋Š” ์—ฐ์‚ฐ์„ ์ด ๋‹จ๊ณ„์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
    • beforeDestroy : Vue ์ธ์Šคํ„ด์Šค๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ
    • destroyed : Vue ์ธ์Šคํ„ด์Šค๊ฐ€ ์ œ๊ฑฐ๋œ ํ›„์— ํ˜ธ์ถœ, ์ด ํ›…์ด ํ˜ธ์ถœ๋  ๋•Œ๋Š” Vue ์ธ์Šคํ„ด์Šค์˜ ๋ชจ๋“  ๋””๋ ‰ํ‹ฐ๋ธŒ์˜ ๋ฐ”์ธ๋”ฉ์ด ํ•ด์ œ๋˜๊ณ , ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ๋„ ๋ชจ๋‘ ์ œ๊ฑฐ๋จ

Part4

Part4. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

  1. ์ธ๋ผ์ธ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
  • ์ด๋ฒคํŠธ๋Š” v-on ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌ
  • Click ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์”€
v-on:click="balance += parseInt(amount)"
  • v-on ๋””๋ ‰ํ‹ฐ๋ธŒ๋Š” @๋กœ ์ค„์—ฌ์“ธ ์ˆ˜ ์žˆ์Œ
@click="balance += parseInt(amount)"
  • Vue ์ธ์Šคํ„ด์Šค์— ๋“ฑ๋กํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ
  1. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ
  • ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘๊ณ , 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>
  1. ์ด๋ฒคํŠธ ๊ฐ์ฒด
  • ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌ ํ•˜๋Š” ๊ฐ์ฒด๋Š” ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ๋ฐ›์Œ
deposit: function(e) {~~}
withdraw: function(e) {~~}
  1. ๊ธฐ๋ณธ ์ด๋ฒคํŠธ
  • 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>
    
  1. ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ๋ฒ„๋ธ”๋ง
  • 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 ๋‹จ๊ณ„์ผ ๋•Œ๋งŒ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ
  1. ์ด๋ฒคํŠธ ์ˆ˜์‹์–ด
  • 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">
    

Part5

Part5. ์Šคํƒ€์ผ

  1. ์Šคํƒ€์ผ ์ ์šฉ
  2. ์ธ๋ผ์ธ ์Šคํƒ€์ผ
  3. CSS ํด๋ž˜์Šค ๋ฐ”์ธ๋”ฉ
  4. ๊ณ„์‚ฐํ˜• ์†์„ฑ, ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ ์Šคํƒ€์ผ ์ ์šฉ
  5. ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ ์Šคํƒ€์ผ ์ ์šฉ
  6. TodoList ์˜ˆ์ œ

6. ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ดˆ

  1. ์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ
  2. ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ
  3. DOM ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ ์ž‘์„ฑ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ
  4. ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ data ์˜ต์…˜
  5. props์™€ event
  6. props๋ฅผ ์ด์šฉํ•œ ์ •๋ณด ์ „๋‹ฌ
  7. event๋ฅผ ์ด์šฉํ•œ ์ •๋ณด ์ „๋‹ฌ
  8. props์™€ event ์—์ œ
  9. ์ด๋ฒคํŠธ ๋ฒ„์Šค ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œ ํ†ต์‹ 
  10. TodoList ์‹ค์ „ ์˜ˆ์ œ

7. ECMAScript 2015

  1. ES2015๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ ์„ค์ •
  2. let๊ณผ const
  3. ๊ธฐ๋ณธ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๊ฐ€๋ณ€ ํŒŒ๋ผ๋ฏธํ„ฐ
  4. ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น(destructuring assignment)
  5. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(Arrow function)
  6. ์ƒˆ๋กœ์šด ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด
  7. ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด
  8. ์ปฌ๋ ‰์…˜
  9. ํด๋ž˜์Šค
  10. ๋ชจ๋“ˆ
  11. Promise
  12. ์ „๊ฐœ ์—ฐ์‚ฐ์ž(Spread Operator)

8. Vue-CLI ๋„๊ตฌ

  1. Vue CLI์˜ ๊ตฌ์„ฑ์š”์†Œ์™€ ์„ค์น˜
  2. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ณผ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•
  3. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
  4. ๋ช…๋ น์–ด ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•
  5. vue-cli-service
  6. ํ”Œ๋Ÿฌ๊ทธ์ธ
  7. vue.config.js
  8. Vue CLI GUI ๋„๊ตฌ

9. ์ปดํฌ๋„ŒํŠธ ์‹ฌํ™”

  1. ๋‹จ์ผ ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ
  2. ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ ์Šคํƒ€์ผ
  3. ๋ฒ”์œ„ CSS(Scoped CSS)
  4. CSS ๋ชจ๋“ˆ(CSS Module)
  5. ์Šฌ๋กฏ
  6. ์Šฌ๋กฏ์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•
  7. ๋ช…๋ช…๋œ ์Šฌ๋กฏ
  8. ๋ฒ”์œ„ ์Šฌ๋กฏ
  9. ๋™์  ์ปดํฌ๋„ŒํŠธ
  10. ์žฌ๊ท€ ์ปดํฌ๋„ŒํŠธ

10. axios๋ฅผ ์ด์šฉํ•œ ์„œ๋ฒ„ํ†ต์‹ 

  1. ์„œ๋น„์Šค API ์†Œ๊ฐœ
  2. axios ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ
  3. http ํ”„๋ก์‹œ ์„ค์ •
  4. axios ์‚ฌ์šฉ
  5. axios ์š”์ฒญ ๋ฐฉ๋ฒ•
  6. axios ์‘๋‹ต ํ˜•์„
  7. ๊ธฐํƒ€ ๋ฉ”์„œ๋“œ
  8. ํŒŒ์ผ ์—…๋กœ๋“œ ์ฒ˜๋ฆฌ
  9. axios ์š”์ฒญ๊ณผ config ์˜ต์…˜
  10. Vue ์ธ์Šคํ„ด์Šค์—์„œ axios ์ด์šฉํ•˜๊ธฐ
  11. axios ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ
  12. ์—ฐ๋ฝ์ฒ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ˆ์ œ
  13. ๊ธฐ์ดˆ ์ž‘์—…
  14. App.vue ์ž‘์„ฑ
  15. ContactList.vue ์ž‘์„ฑ
  16. ์ž…๋ ฅํผ, ์ˆ˜์ •ํผ ์ž‘์„ฑ
  17. ์‚ฌ์ง„ ๋ณ€๊ฒฝํผ ์ž‘์„ฑ
  18. ์ •๋ฆฌ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages