欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue指令實(shí)現(xiàn)OutClick的示例

 更新時(shí)間:2020年11月16日 09:25:26   作者:TMaize  
在一般業(yè)務(wù)中監(jiān)聽的最多的就是 Click 事件,但是在一些業(yè)務(wù)比如 Alert 和 Pop 效果時(shí),需要監(jiān)聽在元素外部的點(diǎn)擊來關(guān)閉彈窗。

原始實(shí)現(xiàn)

下面是兩種常見的模態(tài)框的實(shí)現(xiàn)方式

方案一:默認(rèn) click 都是放在冒泡階段,只要在內(nèi)容區(qū)域上添加 click 的阻止冒泡即可

<div class="cover" @click="close">
 <!-- 阻止冒泡 -->
 <div class="content" @click.stop>modal content</div>
</div>

方案二:通過代碼判斷點(diǎn)擊觸發(fā)的 DOM 是否在內(nèi)容區(qū)域內(nèi)

<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)
}

指令實(shí)現(xiàn)

上面的代碼可以解決全屏的模態(tài)框點(diǎn)擊外部區(qū)域關(guān)閉。但是還有一種 Pop 的彈出,這種彈出的外部區(qū)域不在本組件內(nèi),想要實(shí)現(xiàn)這種彈出的點(diǎn)擊外部區(qū)域關(guān)閉用上面的方式二也是可以的,只需把 mounted 階段把 handleClick 事件添加到 body,在 beforeDestroy 上解綁 body 上的點(diǎn)擊時(shí)間就就可以了。

如果多個(gè)組件需要實(shí)現(xiàn)這點(diǎn)擊外部區(qū)域關(guān)閉的效果,可以通過 Vue 的指令來進(jìn)行封裝

實(shí)現(xiàn)彈窗

<div class="cover">
 <div class="content" v-out-click="close">modal content</div>
</div>

實(shí)現(xiàn)彈出

<button @click="popIsShow = true">顯示氣泡</button>
<div class="pop" v-if="popIsShow" v-out-click="closePop">I'm pop text</div>

指令代碼的具體內(nèi)容如下。有一點(diǎn)比較難受的是指令里面沒有地方能存放變量,只好把把這些變量放到了 DOM 上了。還有就是在使用的時(shí)候要加上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: 忽略點(diǎn)擊外部的按鈕初始化該組件時(shí),觸發(fā)的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) {
 // 通過事件捕獲的順序作為標(biāo)志位
 // 最好不要使用阻止冒泡來實(shí)現(xiàn),那樣會(huì)影響其他的click無法觸發(fā)
 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指令實(shí)現(xiàn)OutClick的示例的詳細(xì)內(nèi)容,更多關(guān)于Vue指令實(shí)現(xiàn)OutClick的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue中使用event的坑及解決event is not defined

    Vue中使用event的坑及解決event is not defined

    這篇文章主要介紹了Vue中使用event的坑及解決event is not defined,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 基于ant-design-vue實(shí)現(xiàn)表格操作按鈕組件

    基于ant-design-vue實(shí)現(xiàn)表格操作按鈕組件

    這篇文章主要為大家介紹了基于ant-design-vue實(shí)現(xiàn)表格操作按鈕組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • vue為自定義路徑設(shè)置別名的方法

    vue為自定義路徑設(shè)置別名的方法

    這篇文章介紹了vue為自定義路徑設(shè)置別名的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • 用Vue實(shí)現(xiàn)頁面訪問攔截的方法詳解

    用Vue實(shí)現(xiàn)頁面訪問攔截的方法詳解

    大家在做前端項(xiàng)目的時(shí)候,大部分頁面, 游客都可以直接訪問 , 如遇到 需要登錄才能進(jìn)行的操作,頁面將提示并跳轉(zhuǎn)到登錄界面,那么如何才能實(shí)現(xiàn)頁面攔截并跳轉(zhuǎn)到對應(yīng)的登錄界面呢,本文小編就來給大家介紹一下Vue實(shí)現(xiàn)頁面訪問攔截的方法,需要的朋友可以參考下
    2023-08-08
  • 淺談Ant Design Pro 菜單自定義 icon

    淺談Ant Design Pro 菜單自定義 icon

    這篇文章主要介紹了Ant Design Pro 菜單自定義 icon,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Vue.use()的作用及原理解析

    Vue.use()的作用及原理解析

    這篇文章主要介紹了Vue.use()的作用及原理解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • VUE3常見面試題總結(jié)大全(看這一篇就夠了)

    VUE3常見面試題總結(jié)大全(看這一篇就夠了)

    Vue.js是一個(gè)流行的前端JavaScript框架,用于構(gòu)建用戶界面和單頁應(yīng)用,這篇文章主要給大家介紹了關(guān)于VUE3常見面試題總結(jié)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • vue 實(shí)現(xiàn) rem 布局或vw 布局的方法

    vue 實(shí)現(xiàn) rem 布局或vw 布局的方法

    這篇文章主要介紹了vue 實(shí)現(xiàn) rem 布局的 或者 vw 布局的方法,本文給提供多種方法,需要的朋友可以參考下
    2019-11-11
  • Vue實(shí)例中el和data的兩種寫法小結(jié)

    Vue實(shí)例中el和data的兩種寫法小結(jié)

    這篇文章主要介紹了Vue實(shí)例中el和data的兩種寫法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Vue實(shí)現(xiàn)雙向綁定的方法

    Vue實(shí)現(xiàn)雙向綁定的方法

    這篇文章主要介紹了Vue實(shí)現(xiàn)雙向綁定的方法,了解vue的雙向數(shù)據(jù)綁定原理以及核心代碼模塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評論