index.ts 988 B

1234567891011121314151617181920212223242526272829303132
  1. import { onBeforeUnmount, onMounted } from 'vue'
  2. import { isClient } from '@vueuse/core'
  3. import { EVENT_CODE } from '@element-plus/constants'
  4. let registeredEscapeHandlers: ((e: KeyboardEvent) => void)[] = []
  5. const cachedHandler = (e: Event) => {
  6. const event = e as KeyboardEvent
  7. if (event.key === EVENT_CODE.esc) {
  8. registeredEscapeHandlers.forEach((registeredHandler) =>
  9. registeredHandler(event)
  10. )
  11. }
  12. }
  13. export const useEscapeKeydown = (handler: (e: KeyboardEvent) => void) => {
  14. onMounted(() => {
  15. if (registeredEscapeHandlers.length === 0) {
  16. document.addEventListener('keydown', cachedHandler)
  17. }
  18. if (isClient) registeredEscapeHandlers.push(handler)
  19. })
  20. onBeforeUnmount(() => {
  21. registeredEscapeHandlers = registeredEscapeHandlers.filter(
  22. (registeredHandler) => registeredHandler !== handler
  23. )
  24. if (registeredEscapeHandlers.length === 0) {
  25. if (isClient) document.removeEventListener('keydown', cachedHandler)
  26. }
  27. })
  28. }