vue自定义指令实现点击元素以外区域隐藏当前元素

经常接到这样的需求,自己实现一个弹窗,点击弹窗以外地方隐藏当前弹窗,抽空安排一下vue自定义指令。

实现思想
  1. 监听点击事件
  2. 判断点击事件target会否为当前dom
  3. 注意取消监听事件
实现过程
  1. 实现clickoutside .js
const clickoutside = {
  bind(el, binding) {
    const documentHandler = (e) => {
      if (el.contains(e.target)) return false
      if (binding.expression) {
        binding.value(e)
      }
    }
    el.documentHandler= documentHandler
    document.addEventListener('click', documentHandler, false)
  },
  unbind(el) {
    document.removeEventListener('click', el.documentHandler, false)
    delete el.documentHandler
  }
}

export default clickoutside
  1. 实现vue中自定义组件的目录index.js
import clickoutside from './clickoutside'

const directives = {
  clickoutside
}
export default {
  install(Vue) {
    Object.keys(directives).forEach((key) => {
      Vue.directive(key, directives[key])
    })
  }
}
  1. main.js中统一注册自定义指令
import Vue from 'vue'
import App from './App.vue'
import directives from '@/directives/index.js'

Vue.use(directives)

new Vue({
  render: h => h(App),
}).$mount('#app')
  1. 页面使用
<template>
  <div class="dom" v-if="isShow" v-clickoutside="()=>{}">
  </div>
</template>

<script>
export default {
  data(){
  	return{
	  isShow: false
	}
  }
}
</script>

<style lang="less" scoped>

</style>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值