ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vue.js 문법 - 이벤트 수식어
    Vue/Vue.js 문법 2021. 7. 15. 02:28

     

    이벤트 수식어

     

    - 이벤트 핸들러 내부에서 event.preventDefault() 또는 event.stopPropagation()를 호출하는 것은 매우 보편적인 일

    - 메소드 내에서 쉽게 이 작업을 할 수 있지만, DOM 이벤트 세부 사항을 처리하는 대신 데이터 로직에 대한 메소드만 사용할 수 있으면 더 좋습니다.

    - 이 문제를 해결하기 위하여, Vue는 v-on이벤트에 이벤트 수식어를 제공, 수식어는 점으로 된 접미사

     

    • .stop
    • .prevent
    • .capture
    • .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>
    
    <!-- 클릭 이벤트는 최대한 한번에 트리거 됩니다.-->
    <a @click.once="doThis"></a>
    
    <!-- 스크롤의 기본 이벤트를 취소할 수 없습니다. -->
    <!-- 바로, `onScroll`완료되는 것을 기다리는 것을 대신합니다.  -->
    <!-- 이 경우에`event.preventDefault()`를 포함하고 있습니다. -->
    <!-- 특히 .passive 수식어는 모바일 환경에서 성능향상에 도움이 됩니다 -->
    <!-- 화면의 스크롤과 로직 처리를 독립시켜준다 -->
    <div @scroll.passive="onScroll">...</div>

     

    이벤트 버블링

     

    <template>
      <div
        class="parent"
        @click="handlerA">
        <div
          class="child"
          @click="handlerB">
        </div>
      </div>
    </template>
    <script>
    export default {
      methods: {
        handlerA() {
          console.log('A')
        },
        handlerB() {
          console.log('B')
        }
      }
    }
    </script>
    <style scoped lang="scss">
     .parent {
       width: 200px;
       height: 100px;
       background-color: royalblue;
       margin: 10px;
       padding: 10px;
       .child {
         width: 100px;
         height: 100px;
         background-color: orange;
       }
     }
    </style>

     

    결과

     

    코드 이해하기

    - 파란 박스 (parent)를 클릭하면 handlerA() 동작

    - 오렌지 박스 (child)를 클릭하면 handlerB() 동작, 이후 부모 요소 handlerA() 동작

    - 상위 요소로 점점 확산되는 이러한 개념을 이벤트 버블링 이라고 부름

    - 이벤트 버블링 방지 방법으로는 이벤트 수식어 .stop 을 사용할 수 있음

     

    이벤트 캡처링 (Event Capturing)

     

    - 이벤트 버블링의 반대되는 개념

    - 하위 요소로 점점 확산되는 개념을 이벤트 캡처링 이라고 부름

     

    - 위의 예제에서 오렌지 박스를 클릭하면 자식 요소 메소드인 handlerB()가 먼저 동작

    - 이후 부모 요소 메소드인 handlerA()가 동작하는 순서

    - 부모 요소에 이벤트 수식어 .capture 를 사용하면 handlerA() 먼저 동작, 이후 handlerB() 동작

    - 오렌지 박스를 클릭했을때 handlerA()만 동작하게 하려면 .capture.stop 메소드 체이닝을 이용

    'Vue > Vue.js 문법' 카테고리의 다른 글

    Vue.js 문법 - 폼 입력 바인딩  (0) 2021.07.15
    Vue.js 문법 - 키 수식어  (0) 2021.07.15
    Vue.js 문법 - 이벤트 핸들링  (0) 2021.07.14
    Vue.js 문법 - 리스트 렌더링  (0) 2021.07.14
    Vue-js 문법 - 조건부 렌더링  (0) 2021.07.14

    댓글

Designed by Tistory.