Skip to content

Commit

Permalink
feat(useElementHover): give hook delay properties (#2741)
Browse files Browse the repository at this point in the history
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
  • Loading branch information
LockingReal and antfu committed Feb 18, 2023
1 parent f887255 commit 232834c
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 4 deletions.
2 changes: 1 addition & 1 deletion packages/core/useElementHover/demo.vue
Expand Up @@ -3,7 +3,7 @@ import { ref } from 'vue'
import { useElementHover } from '@vueuse/core'
const el = ref<HTMLButtonElement>()
const isHovered = useElementHover(el)
const isHovered = useElementHover(el, { delayEnter: 200, delayLeave: 600 })
</script>

<template>
Expand Down
31 changes: 28 additions & 3 deletions packages/core/useElementHover/index.ts
Expand Up @@ -2,12 +2,37 @@ import type { Ref } from 'vue-demi'
import { ref } from 'vue-demi'
import type { MaybeComputedRef } from '@vueuse/shared'
import { useEventListener } from '../useEventListener'
import type { ConfigurableWindow } from '../_configurable'

export function useElementHover(el: MaybeComputedRef<EventTarget | null | undefined>): Ref<boolean> {
export interface UseElementHoverOptions extends ConfigurableWindow {
delayEnter?: number
delayLeave?: number
}

export function useElementHover(el: MaybeComputedRef<EventTarget | null | undefined>, options: UseElementHoverOptions = {}): Ref<boolean> {
const delayEnter = options ? options.delayEnter : 0
const delayLeave = options ? options.delayLeave : 0
const isHovered = ref(false)
let timer: ReturnType<typeof setTimeout> | undefined

const toggle = (entering: boolean) => {
const delay = entering ? delayEnter : delayLeave
if (timer) {
clearTimeout(timer)
timer = undefined
}

if (delay)
timer = setTimeout(() => isHovered.value = entering, delay)
else
isHovered.value = entering
}

if (!window)
return isHovered

useEventListener(el, 'mouseenter', () => isHovered.value = true)
useEventListener(el, 'mouseleave', () => isHovered.value = false)
useEventListener(el, 'mouseenter', () => toggle(true), { passive: true })
useEventListener(el, 'mouseleave', () => toggle(false), { passive: true })

return isHovered
}

0 comments on commit 232834c

Please sign in to comment.