实现一个点击空白区域关闭显示的自定义指令

typescript

import type { DirectiveBinding } from "vue";

export default {
  bind(el: HTMLElement, binding: DirectiveBinding<Function>) {
    //声明一个给document绑定的事件
    function documentClick(event: Event) {
      const target = event.target as unknown as Node;
      if (el.contains(target)) {
        return false;
      }
      //如果绑定了关闭函数就触发
      if (binding.expression) {
        binding.value(event);
      }
    }
    // 给当前元素绑定个私有变量,方便在unbind中可以解除事件监听
    el["__clickOutside__"] = documentClick;
    document.addEventListener("click", documentClick);
  },
  unbind(el: HTMLElement) {
    // 解除事件监听
    document.removeEventListener("click", el["__clickOutside__"]);
    Reflect.deleteProperty(el, "__clickOutside__");
  },
};

使用

import Vue from "vue";

import clickOutside from "@/directives/clickOutside";
Vue.directive("clickOutside", ClickOutside);
<template>
 <div class="menu-wrap" v-clickOutside="Close">
   ...
 </div>
</template>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值