亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

原始實現(xiàn)

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

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

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

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

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

指令實現(xiàn)

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

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

實現(xiàn)彈窗

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

實現(xiàn)彈出

<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: 忽略點擊外部的按鈕初始化該組件時,觸發(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) {
 // 通過事件捕獲的順序作為標志位
 // 最好不要使用阻止冒泡來實現(xiàn),那樣會影響其他的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指令實現(xiàn)OutClick的示例的詳細內容,更多關于Vue指令實現(xiàn)OutClick的資料請關注腳本之家其它相關文章!

相關文章

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

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

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

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

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

    vue為自定義路徑設置別名的方法

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

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

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

    淺談Ant Design Pro 菜單自定義 icon

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

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

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

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

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

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

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

    Vue實例中el和data的兩種寫法小結

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

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

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

最新評論