[Vue.js] ๋ทฐ ๊ธฐ์ดˆ

101400 ๋‹จ์–ด JavaScriptvuejshtmlJavaScript

Vue.js ๊ธฐ๋ณธ ๊ตฌ์กฐ

  • Vue ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ ์„ธ๊ฐœ์˜ ๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.
  1. template: html๋ถ€๋ถ„์ด๋‹ค. ์ด ์•ˆ์— styleํƒœ๊ทธ์™€ scriptํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  2. script: ์ด ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉํ•  ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์ด๋‹ค. import๋กœ ์™ธ๋ถ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  3. style: ์ด ํ…œํ”Œ๋ฆฟ์—์„œ ์‚ฌ์šฉํ•  css์ด๋‹ค. scoped์†์„ฑ์„ ๋ถ€์—ฌํ•˜๋ฉด ๋”ฑ ์ด ์Šคํƒ€์ผ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์—†์œผ๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋„ ์ผ๊ด„ ์ ์šฉ๋œ๋‹ค.

  • Vue.js๋Š” (Value, Key) ์ˆœ์„œ์ด๋‹ค.

  • this.$set(person1, 'name', 'John') ๋ฉ”์†Œ๋“œ๋กœ vue๊ฐ€ ๊ฐ์ฑ„ ๋‚ด ๋ณ€ํ™”๋ฅผ ์•Œ์•„์ฑ„๊ณ  ์žฌ๋ Œ๋”๋ง ์‹œํ‚ด

  • vue๋Š” ๊ฐ์ฒด ์ž์ฒด์˜ ๋ณ€ํ™”๋Š” ๊ฐ์ง€ํ•˜์ง€๋งŒ ๊ฐ์ฒด ๋‚ด ์†์„ฑ, ๋ฐฐ์—ด ๊ฐ’ ๋ณ€ํ™” ๋“ฑ ๊ฐ์ฑ„ ๋‚ด ๋ณ€ํ™”๋Š” ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

  • ๋ฐฐ์—ด์˜ ํฌ๊ธฐ ๋ณ€๊ฒฝ์„ ์žฌ๋ Œ๋”๋ง ํ•  ๋•Œ, splice ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉ ex) this.arr.splice(4) : arr๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ 4๋กœ ์žฌ๋ Œ๋”๋ง

  • mousedown/mousedown ์ด๋ฒคํŠธ(๋ชจ๋“  ์ด๋ฒคํŠธ๋Š” '@'๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅํ•˜๋‹ค)์—์„œ

method:function(e){
   if(e.button==0 ๋˜๋Š” 1 ๋˜๋Š” 2) // 0: ์™ผ์ชฝ๋งˆ์šฐ์Šค, 2: ์˜ค๋ฅธ์ชฝ๋งˆ์šฐ์Šค
}

<a> : anchor ์•ต์ปค ํƒœ๊ทธ (๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œํ‚ค๋Š” ํƒœ๊ทธ)

<a @click.prevent href="http://www.naver.com">naver๋งํฌ</a> // click์ด๋ฒคํŠธ์— prevent๋ฅผ ์“ฐ๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๋ง‰๋Š”๋‹ค.

์ด๋ฒคํŠธ

  • self : ์ž์‹ ์„ ์ง์ ‘ ๋ˆŒ๋ €์„๋•Œ๋งŒ ์ด๋ฒคํŠธ ๋ฐœ์ƒ
  • stop : ์ž์‹  ์ด๋ฒคํŠธ๊นŒ์ง€๋งŒ ์‹คํ–‰ ์‹œํ‚ค๊ณ  ํ•˜์œ„ ์ด๋ฒคํŠธ๋Š” ์ค‘์ง€
  • prevent
  • capture : ์šฐ์„ ์ˆœ์œ„์•  ๋”ฐ๋ผ ์ด๋ฒคํŠธ ๋ฐœ์ƒ
  • once : ์ด๋ฒคํŠธ ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒ

  • props : ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ, ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • template : ์™ธ๋ถ€์—์„œ ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ๋ Œ๋”๋ง๋  ํ…œํ”Œ๋ฆฟ์ด๋‹ค.
  • data : ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์“ฐ์ผ ๋ณ€์ˆ˜
  • methods : ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์“ฐ์ผ ๋ฉ”์†Œ๋“œ
<!DOCTYPE html>
<html lang="kr">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <simple-component v-bind:initial-counter="counter"></simple-component> <!-- HTML ์˜์—ญ -->
</div>
</body>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>
<script> // Vue.js ์˜์—ญ

    // ๊ธ€๋กœ๋ฒŒ ์ปดํฌ๋„ŒํŠธ
    Vue.component('simple-component', { // Vue.component([์ปดํฌ๋„ŒํŠธ๋ช…],[์ปดํฌ๋„ŒํŠธ์ •๋ณด]) / simple-component๋Š” ํ•ด๋‹น Vue ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„
        props: ['initialCounter'], // props๋งŒ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅ
        template: '<button @click="addCounter">{{counter}}</button>',
        data: function () {
            return {
                counter: this.initialCounter
            };
        },
        methods: {
            addCounter: function () {
                this.counter += 1;
            }
        }
    });

    new Vue({
        el: '#app',
        data: {
            counter: 0
        },
        components: {
            'simple-component': simpleComponent, // ๋กœ์ปฌ ์ปดํฌ๋„ŒํŠธ
        }
    });
</script>
</html>

๋„ค์ด๋ฐ ์ผ€์ด์Šค

  1. ์ผ€๋ฐฅ-์ผ€์ด์Šค: kebab-case, spinal-case, Train-Case, Lisp-case
    -ํ•˜์ดํ”ˆ์œผ๋กœ ๋‹จ์–ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ‘œ๊ธฐ๋ฒ•
    -HTML ํƒœ๊ทธ์˜ id, class ์†์„ฑ์œผ๋กœ ํ”ํžˆ ์‚ฌ์šฉ๋จ.

  2. ํŒŒ์Šค์นผ ํ‘œ๊ธฐ๋ฒ•: PascalCase, BackgroundColor, TypeName, PowerPoint
    -์ฒซ ๋‹จ์–ด๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ‘œ๊ธฐ๋ฒ•

  3. ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค(๋ฑ€ ํ‘œ๊ธฐ๋ฒ•):
    snake_case, background_color, type_name
    -๋‹จ์–ด๋ฅผ ๋ฐ‘์ค„ ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ํ‘œ๊ธฐ๋ฒ•
    -perl, php, python, ruby, rust....

  4. ํ—๊ฐ€๋ฆฌ์–ธ ํ‘œ๊ธฐ๋ฒ•:
    strName, bBusy, szName
    -์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ‘œ๊ธฐ๋ฒ•
    -str -> string, b -> boolean, sz -> null๋กœ ๋๋‚˜๋Š” ๋ฌธ์ž์—ด(string+zero)

  5. ์นด๋ฉœ์ผ€์ด์Šค:
    ex) userName

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ์นด๋ฉœ์ผ€์ด์‹ฑ์œผ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” HTML๋‚ด์—์„œ ์ผ€๋ฐฅ์ผ€์ด์‹ฑ์œผ๋กœ ์ž๋™๋ณ€ํ™˜๋œ๋‹ค.

  • userName(JS) -(์ž๋™๋ณ€ํ™˜)-> user-name(HTML)

  • '{{ }}' : ๋จธ์Šคํƒœ์น˜


๋ผ์šฐํŒ…

  • https://www.naver.com/user/ ์—์„œ ์ปจํ…์ŠคํŠธ ๋ฃจํŠธ๋Š” https://www.naver.com

  • ๋งŒ์•ฝ http://www.naver.com/user/#/kim ์ด๋ผ๋ฉด '#' ์ดํ•˜๋ถ€ํ„ฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ผ์šฐํŒ… ๋œ๊ฑฐ์ž„

  • ํ”„๋ก ํŠธ์—”๋“œ์—์„œ Vue๋กœ ๋ผ์šฐํŒ…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ˆœํžˆ Vue ๋ฟ๋งŒ์•„๋‹ˆ๋ผ Vue-router๊ฐ€ ํ•„์š”


๋™์ ๋ณ€๊ฒฝ

  • v-model์„ ์ด์šฉํ•˜์—ฌ ๋™์ ๋ณ€๊ฒฝ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ
<body>
<div id="app">
    <input v-model="name">
    <br/>
    {{name}}
</div>
</body>
<script>

    new Vue({
        el: '#app',
        data: {
            name: 'kimdongmin',
        }
    });

</script>

Vue Import

    <template>
        <div id="app">
            <img alt="Vue logo" src="./assets/logo.png">
            <HelloWorld msg="Welcome to Your Vue.js App"/>
        </div>
    </template>

    <script>
    import HelloWorld from './components/HelloWorld.vue'

    export default {
        name: 'app',
        components: {
            HelloWorld
        },
    }
    </script>
  1. VueํŒŒ์ผ์„ import์‹œํ‚จ๋‹ค.
    • import๊ตฌ๋ฌธ์˜ ๊ฒฐ๊ณผ๋กœ vue์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.
    • ๋‹จ, ๋ถˆ๋Ÿฌ ์˜ค๋Š” ์‹œ์ ์—์„œ js๊ฐ์ฒด๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. (์ปดํŒŒ์ผ ๋˜๋Š”๊ฑฐ์ž„)
  2. components์— ํฌํ•จ์‹œ์ผœ์ค€๋‹ค.
    • ๊ทธ๋ž˜์•ผ template ๊ตฌ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Vue.js ๋ผ์ดํ”„์‚ฌ์ดํด

  1. beforeCreate: ๋”์— ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ

  2. created: this.data ๋˜๋Š” this.fetchData() ๋ฅผ ์ด์šฉํ•˜์—ฌ data, methods์— ์ •์˜๋œ ๊ฐ’์— ์ ‘๊ทผ ๊ฐ€๋Šฅ. ๋‹จ, template ์†์„ฑ์— ์ •์˜๋œ ๋” ์š”์†Œ๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€

  3. beforeMount: render() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ง์ „์˜ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ข‹์Œ

  4. mounted: ํ™”๋ฉด ์š”์†Œ(๋”)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ํ™”๋ฉด ์š”์†Œ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ข‹์€ ๋‹จ๊ณ„

  5. beforeUpdate: ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋กœ์ง์€ ๊ฐ€๊ธ‰์  beforeUpdate์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

  6. updated: ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ์˜ ํ™”๋ฉด ์š”์†Œ(๋”)์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

  7. beforeDestroy: ๋ทฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ํŒŒ๊ดด๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ. ๋ทฐ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์ข‹์€ ๋‹จ๊ณ„

  8. destroyed

    new Vue({
            el: '#app',
            data: {
                name: 'kimdongmin',
            },
            beforeCreate: function(){
                console.log("beforeCreate")
            },
            created: function(){
                console.log("created")
            },
            mounted: function(){
                console.log("mounted")
                this.name = 'dongminkim' // beforeUpdate & updated ๋ผ์ดํ”„์‚ฌ์ดํด๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์œ„ํ•ด name์„ update ํ•จ
            },
            beforeUpdate: function(){
                console.log("beforeUpdate")
            },
            updated: function(){
                console.log("updated")
            }                
        });
    • ์ด๋Ÿฌํ•œ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์†Œ๋“œ ๋‚ด์— ๊ฐ ๋ผ์ดํ”„์‚ฌ์ดํด ์‹œ์ ์— ๋งž๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Vue ์ปดํฌ๋„ŒํŠธ

  1. ์ „์—ญ ์ปดํฌ๋„ŒํŠธ
Vue.component('์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„', {
    // ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ
});

์˜ˆ์‹œ

<body>
<div id="app">
    <button>์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก</button>
    <test-component></test-component> <!-- JS์˜ ์นด๋ฉœ์ผ€์ด์Šค๋Š” HTML์—์„œ ์ผ€๋ฐฅ์ผ€์ด์Šค๋กœ ๋ฐ”๋€œ -->
</div>
</body>
<script>

    // ๊ธ€๋กœ๋ฒŒ ์ปดํฌ๋„ŒํŠธ
    Vue.component('testComponent', { // JS์˜ ์นด๋ฉœ์ผ€์ด์Šค๋Š” HTML์—์„œ ์ผ€๋ฐฅ์ผ€์ด์Šค๋กœ ๋ฐ”๋€œ (testComponent -> test-component)
        template: '<div>์ „์—ญ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค.</div>',
    });

    new Vue({
        el: '#app',
        data: {
            name: 'kimdongmin',
        },
        
    });

</script>
  1. ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ
<script>
    var cmp = {
        template: '<div>์ง€์—ญ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ฑ๋ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค!</div>'
    };

    new Vue({
        el: '#app',
        components: {
            'my-local-component': cmp
        }
    });
</script>
  1. ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ & ์ „์—ญ ์ปดํฌ๋„ŒํŠธ
<body>
<div id="app">
    <b>์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก</b>
    <test-local-component></test-local-component>  <!-- ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ํ‘œ์‹œ -->
    <test-global-component></test-global-component> <!-- ์ „์—ญ ์ปดํฌ๋„ŒํŠธ ํ‘œ์‹œ -->
</div>
</body>
<script>

    // ์ „์—ญ ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก
    Vue.component('test-global-component', {
        template: "<div>์ „์—ญ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.</div>" // ์ „์—ญ ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ
    });

    // ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ
    var localcmp = {
        template: "<div>์ง€์—ญ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.</div>"
    }

    new Vue({
        el: '#app',
        data: {
        },
        components:{ // ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก 
            'test-local-component' : localcmp,
        }
    });

</script>
  • ์ „์—ญ ์ปดํฌ๋„ŒํŠธ๋Š” app, app1 ... ๋“ฑ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ง€์—ญ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ๋ ‡์ง€ ๋ชปํ•˜๋‹ค.
<body>
<div id="app">
    <simple-component></simple-component> <!-- ์ „์—ญ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ O -->
    <local-component></local-component> <!-- ๋กœ์ปฌ ์ปดํฌ๋„ŒํŠธ -->
</div>

<div id="app1">
    <simple-component></simple-component> <!-- ์ „์—ญ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ O -->
    <local-component></local-component> <!-- Error ๋กœ์ปฌ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ X -->
</div>

</body>
<script>

    Vue.component('simpleComponent', {
        template: '<b>Hello, world!</b>',
    });

    var cmp = {
        template: '<h1>Hello world local compoenents</h1>'
    }

    new Vue({
        el: "#app",
        data: {
        },
        components: {
            'local-component': cmp,
        },
    });

    new Vue({ // ์ƒ์„ฑ์ž ์ถ”๊ฐ€
        el: "#app1",
        data: {
        },
    });
    
</script>

์ƒํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๊ด€๊ณ„

  • props ๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ๋Š” ์ด๋ฒคํŠธ๋งŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ. (์ด๋ฒคํŠธ ๋ฒ„์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ€๋Šฅ?)
Vue.component('child-component', {
    props:['props ์†์„ฑ ์ด๋ฆ„'],
});

์˜ˆ์‹œ

<body>
<div id="app">
    <child-component :propstest="message"></child-component>
</div>
</body>
<script>
    Vue.component('child-component', {
        props:['propstest'],
        template: "<p>{{propstest}}</p>" 
    });
    new Vue({
        el: '#app',
        data: {
            message: "hello, world",
        },
    });

</script>

์ƒํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ด๋ฒคํŠธ

  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ
this.$emit('์ด๋ฒคํŠธ๋ช…')
  • ์ด๋ฒคํŠธ ์ˆ˜์‹ 
<child-component v-on:์ด๋ฒคํŠธ๋ช…="์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ๋ช…"></child-component>

์˜ˆ์‹œ

<body>
<div id="app">
    <child-component v-on:show-log="printText"></child-component> 
    <!-- show-log: ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฒคํŠธ ๋ช…, printText: ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ ๋ช… --> 
</div>
</body>
<script>

    Vue.component('child-component', {
        template: "<button v-on:click='showLog'>show</button>" // ๋ฒ„ํŠผ ์š”์†Œ ์ถ”๊ฐ€
        ,methods:{
            showLog:function(){
                this.$emit('show-log'); // ์ด๋ฒคํŠธ ๋ฐœ์ƒ ๋กœ์ง (์ผ€๋ฐฅ ์ผ€์ด์‹ฑ)
            }
        }
    });
    new Vue({ // ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ  
        el: '#app',
        data: {
            message: "hello, world",
        },
        methods:{
            printText:function(){
                console.log(this.message);
            }
        }
    });

</script>

์ด๋ฒคํŠธ ๋ฒ„์Šค

  • ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์€ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ(๊ณตํ†ต)๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ ํ›„ props๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค(์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•œ ์ž๊ธฐ์ž์‹  ํฌํ•จ, ๋Œ€์ƒ ๊ฐ™์€๋ ˆ๋ฒจ ์ปดํฌ๋„ŒํŠธ)์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•จ
  • ์ด์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ตฌ์กฐ๋Š” ๋น„ํšจ์œจ์ ์ด๋ฏ€๋กœ '์ด๋ฒคํŠธ ๋ฒ„์Šค'๋ฅผ ํ™œ์šฉ
  • ์ด๋ฒคํŠธ ๋ฒ„์Šค๋Š” ์ƒํ•˜์œ„ ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์ง€ ์•Š์•„๋„ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ฐ€๋Šฅ. (Vuex ์ฃผ๋กœ ์‚ฌ์šฉ)
<body>
<div id="app">
    <child-component></child-component>
</div>
</body>
<script>

    var eventBus = new Vue(); // ์ด๋ฒคํŠธ ๋ฒ„์Šค ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

    // ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ
    Vue.component('child-component',{
        template: "<button v-on:click='showLog'>show</button>",
        methods:{
            showLog:function(){
                eventBus.$emit('triggerEventBus', 100, 150, "hello"); // ์ด๋ฒคํŠธ ๋ฐœ์‹ , $emit
            }
        }
    });

    // ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ
    new Vue({
        el: '#app',
        data: {
            message: "hello, world! Vue.js"
        },
        methods:{
        },
        created:function(){
            eventBus.$on('triggerEventBus', function(value1, value2, value3){ // ์ด๋ฒคํŠธ ์ˆ˜์‹ , $on
                console.log(value1, value2, value3);
            });
        }
    });

</script>
  • ํ•˜์ง€๋งŒ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์„œ ์–ด๋””๋กœ ๋ณด๋ƒˆ๋Š”์ง€ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ ธ Vuex(๋ทฐ์—‘์Šค)๋ผ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋ผ์šฐํŒ…

  • ์›น ํŽ˜์ด์ง€ ๊ฐ„์˜ ์ด๋™ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ

  • ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜: ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์— ์›น ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜์—ฌ ์ƒˆ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฏธ๋ฆฌ ํ•ด๋‹น ํŽ˜์ด์ง€๋“ค์„ ๋ฐ›์•„ ๋†“๊ณ  ํŽ˜์ด์ง€ ์ด๋™ ์‹œ์— ํด๋ผ์ด์–ธํŠธ์˜ ๋ผ์šฐํŒ…์„ ์ด์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•˜๋Š” ํŒจํ„ด

  • CDN: ์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ(Content delivery network ๋˜๋Š” content distribution network)

 <body> 
    <div id="app">
      <h1>๋ทฐ ๋ผ์šฐํ„ฐ ์˜ˆ์ œ</h1>
      <p>
        <router-link to="/main">Main ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™</router-link> <!-- to=""์— ์ •์˜๋œ ํ…์ŠคํŠธ ๊ฐ’์ด ๋ธŒ๋ผ์šฐ์ € URL ๋์— ์ถ”๊ฐ€๋จ -->
        <router-link to="/login">Login ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™</router-link>
        <router-link to="/sub">Sub ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™</router-link>
      </p>
      <router-view></router-view> <!-- URL ๊ฐ’์— ๋”ฐ๋ผ ๊ฐฑ์‹ ๋˜๋Š” ํ™”๋ฉด ์˜์—ญ -->
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router@3.0.1/dist/vue-router.js"></script> <!-- ๋ผ์šฐํ„ฐ CDN -->
    <script>
      // 3. Main. Login ์ปดํฌ๋„ŒํŠธ ๋‚ด์šฉ ์ •์˜
      var Main = { template: '<div>main</div>' }; // Main ์ปดํฌ๋„ŒํŠธ ์ •์˜
      var Login = { template: '<div>login</div>' };
      var Sub = { template: '<div>sub</div>'}

      // 4. ๊ฐ url์— ํ•ด๋‹นํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋“ฑ๋ก
      var routes = [
        { path: '/main', component: Main }, // routes ๋ณ€์ˆ˜์—๋Š” URL ๊ฐ’์ด /main ์ผ ๋•Œ Main ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ์ •์˜
        { path: '/login', component: Login },
        { path: '/sub', component: Sub },
      ];

      // 5. ๋ทฐ ๋ผ์šฐํ„ฐ ์ •์˜
      var router = new VueRouter({ // ๋ทฐ ๋ผ์šฐํ„ฐ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๊ณ , routes๋ฅผ ์‚ฝ์ž…ํ•ด URL์— ๋”ฐ๋ผ ํ™”๋ฉด์ด ์ „ํ™˜๋  ์ˆ˜ ์žˆ๊ฒŒ ์ •์˜
        routes
      });

      // 6. ๋ทฐ ๋ผ์šฐํ„ฐ๋ฅผ ์ธ์Šคํ„ด์Šค์— ๋“ฑ๋ก
      var app = new Vue({
        router // ๋ผ์šฐํ„ฐ ์ถ”๊ฐ€
      }).$mount('#app'); // $mount: ์ธ์Šคํ„ด์Šค๋ฅผ ํ™”๋ฉด์— ๋ถ™์—ฌ์คŒ (el ์†์„ฑ๊ณผ ๋™์ผ)

        // ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ el ์†์„ฑ์„ ๋„ฃ์ง€ ์•Š์•˜๋”๋ผ๋„ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜์„œ $mount()๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ•์ œ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ํ™”๋ฉด์— ๋ถ™์ผ ์ˆ˜ ์žˆ์Œ

    </script>
  </body>

๋ผ์šฐํ„ฐ URL์˜ ํ•ด์‹œ ๊ฐ’(#)์„ ์—†์• ๋ ค๋ฉด

  • ํžˆ์Šคํ† ๋ฆฌ ๋ชจ๋“œ(history mode) ํ™œ์šฉ
var router = new VueRouter({
    mode: 'history',
    routes
});

๋„ค์Šคํ‹ฐ๋“œ ๋ผ์šฐํ„ฐ

  • ๋ผ์šฐํ„ฐ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ, ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
  • ๋„ค์Šคํ‹ฐ๋“œ ๋ผ์šฐํ„ฐ๋ฅผ ์ด์šฉํ•˜๋ฉด URL์— ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ์˜ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ๋จ
 <body>
    <div id="app">
      <router-view></router-view> <!-- User (์ƒ์œ„) ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฟŒ๋ ค์งˆ ์˜์—ญ -->
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router@3.0.1/dist/vue-router.js"></script>
    <script>
      var User = { // ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ ํ…œํ”Œ๋ฆฟ ์ •์˜ (๊ฐ€์‹œ์ ์œผ๋กœ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด button์œผ๋กœ ์ •์˜ํ•จ)
        template: `               
          <button>
            User Component
            <router-view></router-view>
          </button>
        `
        // <router-view></router-view> : ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋„ค์Šคํ‹ฐ๋“œ ๋  ์˜์—ญ
        // ์œ„์™€ ๊ฐ™์ด template์„ ๋“ค์—ฌ์“ฐ๊ธฐํ•˜์—ฌ ํ‘œ๊ธฐํ•˜๋ ค๋ฉด ' ๊ฐ€ ์•„๋‹Œ ` ๋กœ ๋ฌถ์–ด ํ‘œ๊ธฐํ•ด์•„ ํ•จ 
      };
      var UserProfile = { template: '<button>User Profile Component</button>' }; // ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ํ…œํ”Œ๋ฆฟ ์ •์˜ (Profile)
      var UserPost = { template: '<button>User Post Component</button>' }; // ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ (Post)

      var routes = [ // ๋„ค์Šคํ‹ฐ๋“œ ๋ผ์šฐํŒ… ์ •์˜
        {
          path: '/user',
          component: User, // /user url์— User์ปดํฌ๋„ŒํŠธ ๋งคํ•‘
          children: [ // ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋ผ์šฐํŒ… ์ •์˜
            {
              path: 'posts', // /posts url์— UserPost์ปดํฌ๋„ŒํŠธ ๋งคํ•‘
              component: UserPost
            },
            {
              path: 'profile',
              component: UserProfile
            },
          ]
        }
      ];

      var router = new VueRouter({
        routes
      });

      var app = new Vue({ // ๋ทฐ ์ธ์Šคํ„ด์Šค์— ๋ผ์šฐํ„ฐ ์ถ”๊ฐ€
        router
      }).$mount('#app');
    </script>
  </body>
  • domain ๋’ค์— ๋ถ™์ด๊ธฐ

    1. /user : ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ ์œ„์— user(์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ)๊ฐ€ ๋ถ™์Œ
    2. /user/profile : ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ ์œ„์— user(์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ) ์œ„์— profile(ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ)๊ฐ€ ๋ถ™์Œ
    3. /user/posts
  • ๋„ค์Šคํ‹ฐ๋“œ ๋ผ์šฐํ„ฐ๋Š” ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ๋Š” ์œ ์šฉํ•˜์ง€๋งŒ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ๋Š” ๋„ค์ž„๋“œ ๋ทฐ๊ฐ€ ์ข‹์Œ


๋„ค์ž„๋“œ ๋ทฐ

  • ๋„ค์ž„๋“œ ๋ทฐ๋Š” ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์‹œ์— ํ‘œ์‹œํ•˜๋Š” ๋ผ์šฐํŒ… ๋ฐฉ์‹
  • ๋„ค์ž„๋“œ ๋ทฐ๋Š” ์œ„ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ ๊ฐ™์€ ๋ ˆ๋ฒจ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ์‹
  <body>
    <div id="app">
      <router-view name="header"></router-view> <!-- name="header" ๋ผ๋Š” name์„ ๋ช…์‹œ -->
      <router-view></router-view> <!-- name์ด ์—†๋Š” ๊ฒฝ์šฐ 'default' -->
      <router-view name="footer"></router-view>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router@3.0.1/dist/vue-router.js"></script>
    <script>

      // ์ปดํฌ๋„ŒํŠธ์˜ ํ…œํ”Œ๋ฆฟ ์ •์˜
      var Body = { template: '<div>This is Body</div>' };
      var Header = { template: '<div>This is Header</div>' };
      var Footer = { template: '<div>This is Footer</div>' };

      var router = new VueRouter({
        routes: [
          {
            path: '/', // ๋ฃจํŠธ url์— ๋ชจ๋‘ ํ‘œ์‹œ; URL ๊ฐ’ '/'์— ์˜ํ•ด ๋„ค์ž„๋“œ ๋ทฐ๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰ ๋จ
            components: { // <router-view>์˜ name ์†์„ฑ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฐ๊ฒฐ
              default: Body, // default์— Body ์ปดํฌ๋„ŒํŠธ ์—ฐ๊ฒฐ (default๋Š” <router-view> ํƒœ๊ทธ์—์„œ name์„ ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ณณ์— ๋งคํ•‘๋จ)
              header: Header, // header์— Header ์ปดํฌ๋„ŒํŠธ ์—ฐ๊ฒฐ. <router-view name="header"> ์— ๋งคํ•‘
              footer: Footer
            }
          }
        ]
      })

      var app = new Vue({
        router
      }).$mount('#app');
    </script>
  </body>

๋ทฐ HTTP ํ†ต์‹ 

  • ์›น ์•ฑ HTTP ํ†ต์‹ ์˜ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€๋กœ๋Š” jQuery์˜ ajax๊ฐ€ ์žˆ์Œ (JavaScript)

  • ajax๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ, ํ™”๋ฉด ์ „์ฒด๋ฅผ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š๊ณ  ํ™”๋ฉด ์ผ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ

  • Vue์—์„œ๋Š” ๋ทฐ ๋ฆฌ์†Œ์Šค ๋˜๋Š” Axios๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ํ†ต์‹ ์„ ํ•จ. Axios๋ฅผ ํ†ตํ•ด Vue์™€ Spring Controller ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐ€๋Šฅ

  1. ๋ทฐ ๋ฆฌ์†Œ์Šค

  2. Axios ์•ก์‹œ์˜ค์Šค

  • ์•ก์‹œ์˜ค์Šค ๋˜ํ•œ NPM์„ ์ด์šฉํ•˜์—ฌ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ CDN(์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ)์„ ์ด์šฉํ•˜์—ฌ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Œ

  • Axios CDN

    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    • ์œ„ ์ฝ”๋“œ๋ฅผ HTML์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋”ฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋จ

1.

// HTTP GET ์š”์ฒญ
axios.get('URL ์ฃผ์†Œ').then().catch();
  • .get() : HTTP GET ์š”์ฒญ์„ ๋ณด๋ƒ„
  • .then() : ์„œ๋ฒ„์—์„œ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋ฐ›์•„์˜ค๋ฉด then() ์•ˆ์— ์ •์˜ํ•œ ๋กœ์ง ์‹คํ–‰
  • .catch() : ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ catch() ์•ˆ์— ์ •์˜ํ•œ ๋กœ์ง ์ˆ˜ํ–‰

2.

// HTTP POST ์š”์ฒญ
axios.post('URL ์ฃผ์†Œ').then().catch();
  • .post() : HTTP POST ์š”์ฒญ์„ ๋ณด๋ƒ„
  • .then() : ์„œ๋ฒ„์—์„œ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋ฐ›์•„์˜ค๋ฉด then() ์•ˆ์— ์ •์˜ํ•œ ๋กœ์ง ์‹คํ–‰
  • .catch() : ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ catch() ์•ˆ์— ์ •์˜ํ•œ ๋กœ์ง ์ˆ˜ํ–‰

3.

// HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์˜ต์…˜ ์†์„ฑ ์ •์˜
axios({
    method: 'get',
    url: 'URL ์ฃผ์†Œ',
    ...
});
  • HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์†์„ฑ๋“ค์„ ์ง์ ‘ ์ •์˜๊ฐ€๋Šฅ

  • ์˜ˆ์‹œ

	<body>
		<div id="app">
			<button v-on:click="getData">ํ”„๋ ˆ์ž„์›Œํฌ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ</button>
		</div>

		<script src="https://cdn.jsdelivr.net/npm/vue@2.5.2/dist/vue.js"></script>
		<script src="https://unpkg.com/axios/dist/axios.min.js"></script> <!-- axios CDN -->
		<script>
			new Vue({
				el: '#app',
				methods: {
					getData: function() {
						axios.get('https://raw.githubusercontent.com/joshua1988/doit-vuejs/master/data/demo.json')
							.then(function(response) {
								console.log(response);
							}).catch(function(){
                                console.log('Error!')
                            });
					}
				}
			});
		</script>
	</body>
  • 'ํ”„๋ ˆ์ž„์›Œํฌ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ' ๋ฒ„ํŠผ ํด๋ฆญ ํ›„ '๊ฐœ๋ฐœ์ž ๋„๊ตฌ'๋กœ ๊ฐ์ฒด ํ™•์ธ

๋ทฐ ํ…œํ”Œ๋ฆฟ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 
<!-- 1. -->
{{ var a = 10; }} <!-- X, ์„ ์–ธ๋ฌธ์€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ -->
{{ if (true) {return 100} }} <!-- X, ๋ถ„๊ธฐ ๊ตฌ๋ฌธ์€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ -->
{{ true ? 100 : 0 }} <!-- O, ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅ -->

<!-- 2. -->
{{ message.split('').reverse().join('') }} <!-- X, ๋ณต์žกํ•œ ์—ฐ์‚ฐ์€ ์ธ์Šคํ„ด์Šค ์•ˆ์—์„œ ์ˆ˜ํ–‰ -->
{{ reversedMessage }} <!-- O, ์Šคํฌ๋ฆฝํŠธ์—์„œ computed ์†์„ฑ์œผ๋กœ ๊ณ„์‚ฐ ํ›„ ์ตœ์ข… ๊ฐ’๋งŒ ํ‘œํ˜„ -->     
  • ์บ์‹ฑ: ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ’์„ ์ž„์‹œ ์žฅ์†Œ์— ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด ๋†“๋Š” ๋™์ž‘
  • ๋ทฐ ๋””๋ ‰ํ‹ฐ๋ธŒ: HTML ํƒœ๊ทธ ์•ˆ์— v- ์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ์†์„ฑ ex) v-bind, v-if ...

๋ทฐ ๋””๋ ‰ํ‹ฐ๋ธŒ

  • v-if ์ง€์ •ํ•œ ๋ทฐ ๋ฐ์ดํ„ฐ ๊ฐ’์˜ ์ฐธ, ๊ฑฐ์ง“ ์—ฌ๋ถ€์— ๋”ฐ๋ผ HTML ํƒœ๊ทธ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ๋ฏธํ‘œ์‹œ
  • v-for ์ง€์ •ํ•œ ๋ทฐ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ HTML ํƒœ๊ทธ๋ฅผ ๋ฐ˜๋ณต ์ถœ๋ ฅ
  • v-show v-if์™€ ์œ ์‚ฌ, v-if๋Š” ๊ฑฐ์ง“์‹œ ํƒœ๊ทธ๋ฅผ ์™„์ „ ์‚ญ์ œํ•˜์ง€๋งŒ v-show๋Š” cssํšจ๊ณผ๋งŒ display:none์œผ๋กœ ์ฃผ์–ด ์‹ค์ œ ํƒœ๊ทธ๋Š” ๋‚จ๊ณ  ํ™”๋ฉด ์ƒ์œผ๋กœ๋งŒ ๋ณด์ด์ง€ ์•Š์Œ
  • v-bind HTML ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ ์†์„ฑ๊ณผ ๋ทฐ ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ์—ฐ๊ฒฐ
  • v-on ํ™”๋ฉด ์š”์†Œ์˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ ex) v-on:click์€ ํ•ด๋‹น ํƒœ๊ทธ์˜ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
  • v-model form(ํผ)์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ. ํผ์— ์ž…๋ ฅํ•œ ๊ฐ’์„ ๋ทฐ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ์™€ ์ฆ‰์‹œ ๋™๊ธฐํ™”

computed ์†์„ฑ๊ณผ methods ์†์„ฑ์˜ ์ฐจ์ด์  (+ watch ์†์„ฑ)

  • methods ์†์„ฑ์€ ํ˜ธ์ถœํ•  ๋•Œ๋งŒ ํ•ด๋‹น ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜๊ณ , computed ์†์„ฑ์€ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์ ์œผ๋กœ ์ˆ˜ํ–‰๋จ

computed ์žฅ์ 

  • computed ์†์„ฑ์˜ ์ฒซ ๋ฒˆ์งธ ์žฅ์ ์€ data ์†์„ฑ ๊ฐ’์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์—ฐ์‚ฐ
  • computed ์†์„ฑ์˜ ๋‘ ๋ฒˆ์งธ ์žฅ์ ์€ ์บ์‹ฑ - ๋™์ผํ•œ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์„œ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฏธ๋ฆฌ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํ˜ธ์ถœ
  • ๋งŒ์•ฝ ํ™”๋ฉด ์—ฌ๋Ÿฌ ๊ณณ์— ๊ฐ™์€ ๊ฐ’์„ ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์บ์‹ฑ์„ ์ œ๊ณตํ•˜๋Š” computed๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ข‹์Œ
new Vue({
        el: '#app',
        data: {
          message: 'Hello Vue.js!'
        },
        computed: {     // computed
          reverseMsg: function() {
            return this.message.split('').reverse().join('');
          }
        }
      });

watch ์†์„ฑ

  • watch ์†์„ฑ์€ ๋ฐ์ดํ„ฐ ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ํŠน์ • ๋กœ์ง์„ ์ˆ˜ํ–‰
  • ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ๊ณผ ๊ฐ™์ด ์‹œ๊ฐ„์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋” ๋งŽ์ด ์†Œ๋ชจ๋˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉ
  <body>
    <div id="app">
      <input v-model="message"> <!-- v-model ํ™œ์šฉ -->
    </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: {    // watch
          message: function(data) {
            console.log("message์˜ ๊ฐ’์ด ๋ฐ”๋€๋‹ˆ๋‹ค : ", data);
          }
        }
      });
    </script>
  </body>

.vue ํŒŒ์ผ ๊ตฌ์กฐ / ์‹ฑ๊ธ€ ํŒŒ์ผ ์ปดํฌ๋„ŒํŠธ ์ฒด๊ณ„

  • .vue ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋ณธ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
<template>
    <!-- HTML ํƒœ๊ทธ ๋‚ด์šฉ -->
</template>

<script>
export default {
    // ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ
}
</script>

<style>
    /* CSS ์Šคํƒ€์ผ ๋‚ด์šฉ */
</style>

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ