[vue] 엘리먼트 바깥쪽 누를때 레이어 사라지게 하기 > IT 기술백서

IT 기술백서

직접 알아내거나 검색하기 귀찮아서 모아 둔 것

JavaScript | [vue] 엘리먼트 바깥쪽 누를때 레이어 사라지게 하기

본문

1. 플러그인

 

[code]

export default ({ app }) => {

  const Common = {

    install: (Vue) => {

      let handleOutsideClick

      Vue.directive('closable', {

        bind(el, binding, vnode) {

          handleOutsideClick = (e) => {

            e.stopPropagation()

            const { handler, exclude } = binding.value

            let clickedOnExcludedEl = false

            exclude.forEach((refName) => {

              if (!clickedOnExcludedEl) {

                const excludedEl = vnode.context.$refs[refName]

                clickedOnExcludedEl = excludedEl.contains(e.target)

              }

            })

            if (!el.contains(e.target) && !clickedOnExcludedEl) {

              vnode.context[handler]()

            }

          }

          document.addEventListener('click', handleOutsideClick)

          document.addEventListener('touchstart', handleOutsideClick)

        },


        unbind() {

          document.removeEventListener('click', handleOutsideClick)

          document.removeEventListener('touchstart', handleOutsideClick)

        },

      })

     },

  }

})

[/code]

 

2. 사용하는 곳

[code]

exclude: 이벤트에서 제외될 ref (여기서는 자기자신)

handler: 이벤트 발생시 실행될 함수


<template>

  <div

    ref="mydropdown"

    v-closable="{

      exclude: ['mydropdown'],

      handler: 'hideMenu',

    }"

    class="select-language"

  >

     <div><button @click="toggleMenu">메뉴</button></div>

     <!-- 팝업 레이어 -->

     <div v-if="showList" class="mydropdown-menus">

        ...

     </div>

  </div>

</template>


<script>

export default {

  data() {

    return {

      showList: false,

    }

  },

  methods: {

    toggleMenu() {

      this.showList = !this.showList

    },

    hideMenu() {

      this.showList = false

    }

  }

}

</script>

[/code] 

댓글 0개

등록된 댓글이 없습니다.

Menu