2 ๋ถ„ ์†Œ์š”

๐Ÿ“š Vue.js


๐Ÿ“š Vue.js Event

Vue Event ๋ž€

v-on


  • ์‹ค์Šต
<div id="app">
        <button v-on:click="cnt += 1">ํด๋ฆญ</button>
        <p>์œ„ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํšŸ์ˆ˜๋Š”  ๋ฒˆ ์ž…๋‹ˆ๋‹ค.</p>
    </div>

    <script>
        new Vue({
            el: "#app",
            data: {
                cnt: 0,
            },
        });
    </script>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ


method event handler

  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ์ฒ˜๋ฆฌ ๋กœ์ง์„ v-on์— ๋„ฃ๊ธฐ ํž˜๋“ค๋‹ค. ์ด ๋•Œ๋ฌธ์— v-on์—์„œ๋Š” ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” method๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌ


  • ์‹ค์Šต
<div id="app">
        <button v-on:click="greet">Greet</button>
    </div>

    <script>
        new Vue({
            el: "#app",
            data: {
                name: 'JS',
            },
            methods:{
                greet(){
                    alert('Hello ' + this.name + '!');
                }
            }
        })
    </script>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ


inline method handler


  • ์‹ค์Šต
<div id="app">
        <button v-on:click="greet1('JS')">Greet</button>
        <button v-on:click="greet2($event, 'JJS')">Greet</button>
    </div>

    <script>
        new Vue({
            el: "#app",
            methods:{
                greet1(msg){
                    alert('Hello ' + msg + '!');
                },
                greet2(e, msg){
                    if(e) e.preventDefault();
                    alert('Hello ' + msg + '!');
                }
            }
        })
    </script>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ


์ด๋ฒคํŠธ ์ˆ˜์‹์–ด ( Event Modifier )

  • ์œ„์˜ ์˜ˆ์ œ ์ฒ˜๋Ÿผ method๋‚ด์—์„œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, method๋Š” DOM์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค data ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋กœ์ง๋งŒ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, Vue๋Š” v-on ์ด๋ฒคํŠธ์— ์ด๋ฒคํŠธ ์ˆ˜์‹์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์ˆ˜์‹์–ด๋Š” ์ ์œผ๋กœ ํ‘œ์‹œ๋œ ์ ๋ฏธ์‚ฌ์ด๋‹ค.
<!-- ํด๋ฆญ ์ด๋ฒคํŠธ ์ „ํŒŒ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. -->
<a v-on:click.stop="doThis"></a>

<!-- ์ œ์ถœ ์ด๋ฒคํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -->
<form v-on:submit.prevent="onSubmit"></a>

<!-- ์ˆ˜์‹์–ด๋Š” ์ฒด์ด๋‹ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. -->
<a v-on:click.stop.prevent="doThat"></a>

<!-- ๋‹จ์ˆœํžˆ ์ˆ˜์‹์–ด๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -->
<form v-on:submit.prevent></form>

ํ‚ค ์ˆ˜์‹์–ด ( Key Modifier )

<input v-on:keyup.enter="submit">
  • keycode
.enter (.13)
.tab
.delete ("Delete" ์™€ "Backspace" ํ‚ค ๋ชจ๋‘๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค )
.esc
.space
.up
.down
.left
.right

ref, $refs


  • ์‹ค์Šต
<div id="app">
        ์•„์ด๋”” : <input type="text" v-model="id" ref="id"/>
        <button @click="search">์•„์ด๋”” ์ค‘๋ณต ์ฒดํฌ</button>
    </div>

    <script>
        new Vue({
            el: "#app",
            data: {
                id: '',
            },
            methods: {
                search(){
                    if(this.id.length==0){
                        alert('์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•˜์‹œ์˜ค ! ');
                        // ๋‹ค์‹œ ์ž…๋ ฅ์ฐฝ์— ์ปค์„œ ๊ฐ€์ง
                        this.$refs.id.focus();
                        return;
                    }
                    console.log(this.$refs.id.value);
                    alert('์•„์ด๋”” ์ค‘๋ณต์ฒดํฌ ์„ฑ๊ณต');
                },
            },
        });
    </script>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ


CSS class binding


<div id="app">
        <div v-bind:class="{ active: isActive }">Vue CSS ์ ์šฉ</div>
        <button v-on:click="toggle">VueCSS</button>
    </div>

    <script>
        new Vue({
            el: "#app",
            data: {
                isActive: false,
            },
            methods: {
                toggle: function(todo){
                    this.isActive = !this.isActive;
                },
            },
        });
    </script>

    <style>
        .active{
            background: rgb(106, 148, 238);
            color: white;
        }
        div{
            width: 200px;
            height: 200px;
            border:1px solid #444;
        }
    </style>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ



<div id="app">
        <ul>
            <li :class="{completed: todo.done}" :style="myStyle" v-for="todo in todos">
                 <button @click="complete(todo)" class="btn">์™„๋ฃŒ</button>
            </li>
        </ul>
    </div>

    <script>
        new Vue({
            el: '#app',
            data:{
                todos: [
                    {
                        msg: '5์‹œ๊ฐ„ ์ž ์ž๊ธฐ',
                        done: false,
                    },
                    {
                        msg: '์•Œ๊ณ ๋ฆฌ์ฆ˜ 1์‹œ๊ฐ„ ๊ณต๋ถ€ํ•˜๊ธฐ',
                        done: false,
                    },
                    {
                        msg: 'Vue 1์‹œ๊ฐ„ ๊ณต๋ถ€ํ•˜๊ธฐ',
                        done: false,
                    },
                ],
                myStyle: {
                    fontSize: '25px',
                },
            },
            methods : {
                complete(todo){
                    todo.done = !todo.done;
                }
            }
        })
    </script>

    <style>
        .completed{
            text-decoration: line-through;
            font-size: italic;
        }
    </style>
  • ์‹คํ–‰ ๊ฒฐ๊ณผ