Programming/Vue.js

[뷰 Vue.js] 이벤트 핸들링 (Event Handling)

erinh 2022. 11. 3. 15:16
반응형

Listening to Events

- v-on 디렉티브를 이용하여 DOM 이벤트를 듣고 반응하여 JavaScript를 실행

<div id="app">
  <button v-on:click="counter += 1">Add 1</button>
  {{ counter }}
</div>

<script>
  const app = new Vue({
    el: "#app",
    data: {
      counter: 0,
    }
  })
</script>

Methods Event Handlers

- 이벤트 핸들러 뒤에 JavaScript 코드들을 작성하는 것은 복잡성을 높여 좋지 않음
- method로 빼고 v-on 뒤에는 메소드의 이름만 작성함으로써 메소드를 호출할 수 있음

<div id="app">
  <button v-on:click="greet">Greeting</button>
</div>

<script>
  const app = new Vue({
    el: "#app",
    data: {
      name: "Vue.js"
    },
    methods: {
      greet: function(event){
        alert(`Hello ${this.name}`)
        console.log(event.target)
      }
    }
  })
</script>

Methods in Inline Handlers

- 메소드 이름을 직접 바인딩하는 대신 인라인 JS 구문에 메소드 사용 가능

<div id="app">
  <button v-on:click="say('hi')">say hi</button>
  <button @click="say('what')">say what</button>
</div>

<script>
  const app = new Vue({
    el: "#app",
    methods: {
      say: function(message) {
        alert(message)
      }
    }
  })
</script>

- 원본 DOM 이벤트에 엑세스하고 싶을 때는 $event 변수를 사용해 메소드에 전달할 수 있음

<div id="app">
  <button @click="say('hi')">say hi</button>
  <button @click="say2($event, 'hello')">say hello</button>
</div>
<script>
  const app = new Vue({
    el: "#app",
    methods: {
      say(msg) {
        alert(`Hello ${msg}`);
      },
      say2(e, msg) {
        alert(`Hello ${msg}`);
        console.log(e);
      },
    },
  });
</script>

Event Modifiers

- 이벤트를 제어하는 방법으로 Method에 직접 event.preventDefault()등을 사용할 수 있지만,
  메소드에는 데이터 처리를 위한 로직만 작업하는 것이 좋음
- 따라서, DOM의 이벤트를 처리하는 로직을 v-on에 수식어를 붙임으로써 제공하고 있음

- Event Modifier는 체이닝 형태로 사용 가능

<!-- 종속 관계에서 특정 요소만 호출하고 싶은데, 연결된 부모 요소까지 호출되는 경우가 있음(bubbling)-->
<!-- .stop 을 사용할 경우, event bubbling을 막아 원하는 event만 실행됨(클릭 이벤트 전파X) -->
<a v-on:click.stop="doThis"></a>

<!-- 태그가 가지고 있는 기본적 동작이 실행되지 않음(아래 코드에서는 제출이 되지 않음) -->
<form v-on:submit.prevent="onSubmit"></form>

 

.stop event.stopProgagation() 호출함으로써 클릭 이벤트 전파되지 않음
.prevent event.prevetnDeafuly() 호출함으로써, 해당 태그가 가지고 있는 브라우저 동작이 실행되지 않음
.capture 캡쳐 모드에서 이벤트 리스너를 추가함
.self 이벤트가 이 엘리먼트에서 전달된 경우에만 처리됨
.once 이벤트가 단 한 번만 동작함
.passive DOM 이벤트를 { passive: true } 와 연결

Key Modifiers 

- 키보드에 대한 입력을 수신할 때, v-on에 대한 키 수식어를 추가할 수 있음 (엔터를 치면 submit이 되는 형태)

<div id="app">
  <!-- 키를 입력할 때마다 send 메소드가 실행됨 -->
  <input type="text" v-model="name" placeholder="이름 입력1" v-on:keyup="send" />
  <!-- enter를 누르면 send메소드가 실행됨. 13 == enter -->
  <input tpye="text" v-model="name" placeholder="이름 입력2" @keyup.13="send" />
</div>

<script>
  const app = new Vue({
    el: "#app",
    data: {
      name: "",
    },
    methods: {
      send() {
        alert(this.name);
      },
    },
  });
</script>
반응형