OutClick 구현을 위한 Vue 명령의 예

3389 단어 VueOutClickclick
원시적 실현
다음은 두 가지 흔히 볼 수 있는 모드 프레임의 실현 방식이다
방안 1: 기본 클릭은 거품을 막는 단계에 놓여 있습니다. 내용 영역에 클릭을 추가하면 거품을 막을 수 있습니다.

<div class="cover" @click="close">
 <!--   -->
 <div class="content" @click.stop>modal content</div>
</div>
시나리오 2: 터치한 DOM이 컨텐츠 영역에 있는지 코드를 통해 판단

<div class="cover" @click="handleClick">
 <div class="content" ref="content">modal content</div>
</div>
handleClick (e) {
 let clickOut = true
 let temp = e.target
 do {
  if (temp === this.$refs.content) {
   clickOut = false
   break
  }
  temp = temp.parentElement
 } while (temp !== document.documentElement)
 console.log(clickOut)
}
명령 실행
위의 코드는 전체 화면의 모드 상자를 눌러 외부 구역을 닫는 것을 해결할 수 있습니다.그러나 팝업의 팝업도 있다. 이런 팝업의 외부 구역은 본 구성 요소에 있지 않다. 이런 팝업을 실현하려면 외부 구역을 닫고 위의 방식을 사용해도 된다. mounted 단계에서handle Click 이벤트를 body에 추가하고 before Destroy에서 body의 클릭 시간을 풀면 된다.
만약 여러 구성 요소가 이 클릭 외부 영역이 닫히는 효과를 실현해야 한다면 Vue 명령을 통해 봉인할 수 있습니다
실현 탄창

<div class="cover">
 <div class="content" v-out-click="close">modal content</div>
</div>
팝업 실행

<button @click="popIsShow = true"> </button>
<div class="pop" v-if="popIsShow" v-out-click="closePop">I'm pop text</div>
명령 코드의 구체적인 내용은 다음과 같다.한 가지 괴로운 것은 지령에 변수를 저장할 곳이 없어서 어쩔 수 없이 이 변수들을 DOM에 넣었다는 것이다.그리고 사용할 때 v- 접두사를 붙여야 하며, 지령의 이름은 끼지 않아도 된다v-

import outClick from './directive/out-click.js'
Vue.directive(outClick.name, outClick)
const KEY_OUT = '_out_click'
const KEY_OUT_EVENT = '_out_click_event'
const KEY_IN = '_in_click'
const KEY_FLAG = '_in_out_flag'

function removeEvent(el, binding, vnode) {
 el.removeEventListener('click', el[KEY_IN], false)
 window.removeEventListener('click', el[KEY_OUT], false)
 delete el[KEY_IN]
 delete el[KEY_OUT]
 delete el[KEY_OUT_EVENT]
 delete el[KEY_FLAG]
}

function initEvent(el, binding, vnode) {
 // setTimeout 0:  , origin click
 setTimeout(() => {
  el[KEY_OUT] = () => outClick(el)
  el[KEY_IN] = () => inClick(el)
  el[KEY_OUT_EVENT] = binding.value
  el.addEventListener('click', el[KEY_IN], false)
  window.addEventListener('click', el[KEY_OUT], false)
 }, 0)
}

function inClick(el) {
 //  
 //  , click 
 el[KEY_FLAG] = '1'
}

function outClick(el) {
 if (!el[KEY_FLAG] && el[KEY_OUT_EVENT]) {
  el[KEY_OUT_EVENT]()
 }
 delete el[KEY_FLAG]
}

export default {
 name: 'out-click',
 update: (el, binding, vnode) => {
  if (binding.value === binding.oldValue) {
   return
  }
  removeEvent(el, binding, vnode)
  initEvent(el, binding, vnode)
 },
 bind: initEvent,
 unbind: removeEvent
}
이상은 바로 Vue 명령이 OutClick을 실현하는 예시의 상세한 내용입니다. 더 많은 Vue 명령이 OutClick을 실현하는 것에 관한 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기