directives.js 811 B

123456789101112131415161718192021222324252627282930313233
  1. import Vue from "vue";
  2. /**
  3. * Register a specific event: v-click-outside
  4. *
  5. * Example for some modale div:
  6. *
  7. * <template>
  8. * <div v-click-outside="onClickOutside">
  9. * <slot></slot>
  10. * </div>
  11. * </template>
  12. *
  13. * <script>
  14. * setup() {
  15. * const show: Ref<Boolean> = ref(true)
  16. * const onClickOutside = (e: any) => { show.value = false }
  17. * }
  18. * </script>
  19. */
  20. Vue.directive("click-outside", {
  21. bind: function (el, binding, vnode) {
  22. el.clickOutsideEvent = (event) => {
  23. if (!(el === event.target || el.contains(event.target))) {
  24. vnode.context[binding.expression](event)
  25. }
  26. };
  27. document.body.addEventListener("click", el.clickOutsideEvent);
  28. },
  29. unbind(el) {
  30. document.body.removeEventListener("click", el.clickOutsideEvent);
  31. },
  32. });