directives.js 847 B

12345678910111213141516171819202122232425262728293031323334
  1. import Vue from "vue";
  2. /**
  3. * Register a specific event: v-click-out
  4. *
  5. * Example for some modale div:
  6. *
  7. * <template>
  8. * <div v-click-out="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-out", {
  21. bind: function (el, binding, vnode) {
  22. el.clickOutsideEvent = (event) => {
  23. if (!(el === event.target || el.contains(event.target))) {
  24. if(vnode.context[binding.expression])
  25. vnode.context[binding.expression](event)
  26. }
  27. };
  28. document.body.addEventListener("click", el.clickOutsideEvent);
  29. },
  30. unbind(el) {
  31. document.body.removeEventListener("click", el.clickOutsideEvent);
  32. },
  33. });