FrontEnd/Vue

[Vue3] 이벤트 처리

Grace 2023. 4. 17. 16:11

이벤트 처리는 v-on디렉티브로 사용할 수 있습니다. 그리고 v-on이벤트는 자주 사용하기 때문에 @단축 표현으로 많이 사용됩니다.

const counter = ref(0);
<div>
  <button @click="counter += 1">counter {{ counter }}</button>
</div>

메소드 이벤트 핸들러

v-on 디렉티브에서 메소드를 호출할 수 있습니다. 그리고 이때 매개변수로 event 객체를 받습니다.

const printEventInfo = (event) => {
  console.log(event.target);
  console.log(event.target.tagName);
};
<div>
  <button @click="printEventInfo">printEventInfo</button>
</div>

이벤트 객체 접근

인라인 핸들링에서 event 객체에 접근할 수 있습니다. 접근하는 방법는 $event 키워드를 사용합니다.

const printEventInfo2 = (message, event) => {
  console.log('messsage: ', message);
  console.log(event.target);
  console.log(event.target.tagName);
};
<button @click="printEventInfo2('hello world', $event)">
  inline event handler
</button>

이벤트 수식어(Modifiers)

우리는 이벤트를 조작할 때 이벤트 내부에서 event.preventDefault() 또는 event.stopPropagation() 메서드를 호출할 수 있습니다. 메소드에서 이러한 메소드의 호출은 어렵지 않지만 메소드 안에서 비즈니스 외에 이러한 코드는 비효율적입니다.

이 문제를 해결하기 위해 Vue는 v-on 이벤트에 다양한 이벤트 수식어(Modifiers)를 제공합니다.

  • .stop = e.stopPropagation()
  • .prevent = e.preventDefault()
  • .capture = 캡처 모드를 사용할 때 이벤트 리스너를 사용 가능합니다.
  • .self = 오로지 자기 자신만 호출할 수 있다. 즉, 타깃요소가 self일 때 발동된다.
  • .once = 해당 이벤트는 한 번만 실행된다.
  • .passive = 일반적으로 모바일 장치의 성능을 개선 하기 위해 터치 이벤트 리스너와 함께 사용됩니다 .
<!-- 클릭 이벤트 전파가 중단되었습니다. -->
<a @click.stop="doThis"></a>

<!-- 제출 이벤트가 페이지를 다시 로드하지 않습니다. -->
<form @submit.prevent="onSubmit"></form>

<!-- 수정자는 체이닝이 가능합니다. -->
<a @click.stop.prevent="doThat"></a>

<!-- 단순히 수식어만 사용이 가능합니다. -->
<form @submit.prevent></form>

<!-- 캡처 모드를 사용할 때 이벤트 리스너를 사용 가능합니다.-->
<!--즉, 내부 엘리먼트를 대상으로 하는 이벤트가 해당 엘리먼트에서 처리되기 전에 여기서 처리합니다. -->
<div @click.capture="doThis">...</div>

<!-- event.target이 엘리먼트 자체인 경우에만 트리거를 처리합니다.-->
<!-- 자식 엘리먼트에서는 처리되지 않습니다.-->
<div @click.self="doThat">...</div>

<div @scroll.passive="onScroll">...</div>

키 수식어

키보드 이벤트를 수신할 때 종종 특정 키를 확인해야 하는 경우가 있습니다. 그래서 Vue에서는 v-on 또는 @ 디렉티브에 키 수식어를 제공합니다.

  • .enter
  • .tab
  • .delete (”Delete”와 “Backspace” 키 모두를 수신합니다.)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right
<input type="text" @keyup.enter="addTodo" />

시스템 키 수식어

다음 수식어를 사용해 해당 수식어 키가 눌러진 경우에만 마우스 또는 키보드 이벤트 리스너를 트리거 할 수 있습니다.

  • .ctrl
  • .alt
  • .shift
  • .meta (Mac에서 meta는 command key, Window에서 meta는 윈도우키 입니다, 특정 키보드에서 조금 다를 수 있음)
<!-- 알트 + 엔터 -->
<input @keyup.alt.enter="clear" />

<!-- 컨트롤 + 엔터 -->
<input @keyup.ctrl.enter="send" />

<!-- 컨트롤 + 클릭 -->
<div @click.ctrl="doSomething">Do something</div>

.exact 수식어

.exact 수식어는 정확한 조합이 눌러야하는 것을 요구합니다.

<!-- 아래코드는 Alt 또는 Shift와 함께 눌렀을 때도 실행됩니다.-->
<button @click.ctrl="onClick">A</button>

<!-- 아래코드는 Ctrl키만 눌려져 있을 때 실행됩니다.-->
<button @click.ctrl.exact="onCtrlClick">A</button>

<!-- 아래 코드는 시스템 키가 눌리지 않은 상태인 경우에만 작동합니다.-->
<button @click.exact="onClick">A</button>

마우스 버튼 수식어

  • .left
  • .right
  • .middle

'FrontEnd > Vue' 카테고리의 다른 글

[Vue3] watch, watchEffect  (0) 2023.04.17
[Vue3] 양방향 바인딩  (0) 2023.04.17
[Vue3] 디렉티브  (0) 2023.04.17
[Vue3] 리스트 렌더링  (0) 2023.04.17
[Vue3] 조건부 렌더링  (0) 2023.04.17