Skip to content

useEventListener

类别
导出体积
467 B
上次更改
2 minutes ago

轻松使用 EventListener。在组件挂载时使用 addEventListener 进行注册,在组件卸载时自动使用 removeEventListener 进行注销。

用法

js
import { useEventListener } from '@vueuse/core'

useEventListener(document, 'visibilitychange', (evt) => {
  console.log(evt)
})

你也可以将一个 ref 作为事件目标传递给 useEventListener 当你改变目标时,useEventListener 会注销之前的事件并注册新的事件。

ts
import { useEventListener } from '@vueuse/core'

const element = ref<HTMLDivElement>()
useEventListener(element, 'keydown', (e) => {
  console.log(e.key)
})
js
import { useEventListener } from '@vueuse/core'
const element = ref()
useEventListener(element, 'keydown', (e) => {
  console.log(e.key)
})
vue
<template>
  <div v-if="cond" ref="element">
    Div1
  </div>
  <div v-else ref="element">
    Div2
  </div>
</template>

你也可以调用返回的函数来注销监听器。

ts
import { useEventListener } from '@vueuse/core'

const cleanup = useEventListener(document, 'keydown', (e) => {
  console.log(e.key)
})

cleanup() // 这将注销监听器。

注意,如果你的组件也在 SSR (服务器端渲染) 中运行,你可能会遇到错误 (如 document is not defined),因为类似 documentwindow 的 DOM API 在 Node.js 中不可用。为了避免这种情况,你可以将逻辑放在 onMounted 钩子内部。

ts
// onMounted 只会在客户端执行,所以它保证了 DOM API 是可用的。
onMounted(() => {
  useEventListener(document, 'keydown', (e) => {
    console.log(e.key)
  })
})

类型声明

显示类型声明
typescript
interface InferEventTarget<Events> {
  addEventListener: (event: Events, fn?: any, options?: any) => any
  removeEventListener: (event: Events, fn?: any, options?: any) => any
}
export type WindowEventName = keyof WindowEventMap
export type DocumentEventName = keyof DocumentEventMap
export interface GeneralEventListener<E = Event> {
  (evt: E): void
}
/**
 * 在挂载时使用 addEventListener 进行注册,并在卸载时自动使用 removeEventListener 进行移除。
 *
 * 重载 1:监听 window 事件
 *
 * @see https://vueuse.org/useEventListener
 * @param event 事件类型或事件类型数组。
 * @param listener 事件监听器或事件监听器数组。
 * @param options 可选项,用于配置事件监听的行为。
 */
export declare function useEventListener<E extends keyof WindowEventMap>(
  event: Arrayable<E>,
  listener: Arrayable<(this: Window, ev: WindowEventMap[E]) => any>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
 * 在挂载时使用 addEventListener 进行注册,并在卸载时自动使用 removeEventListener 进行移除。
 *
 * 重载 2:显式指定了 Window 目标
 *
 * @see https://vueuse.org/useEventListener
 * @param target Window 目标对象。
 * @param event 事件类型或事件类型数组。
 * @param listener 事件监听器或事件监听器数组。
 * @param options 可选项,用于配置事件监听的行为。
 */
export declare function useEventListener<E extends keyof WindowEventMap>(
  target: Window,
  event: Arrayable<E>,
  listener: Arrayable<(this: Window, ev: WindowEventMap[E]) => any>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
 * 在挂载时使用 addEventListener 进行注册,并在卸载时自动使用 removeEventListener 进行移除。
 *
 * 重载 3:显式指定了 Document 目标
 *
 * @see https://vueuse.org/useEventListener
 * @param target Document 或 ShadowRoot 目标对象。
 * @param event 事件类型或事件类型数组。
 * @param listener 事件监听器或事件监听器数组。
 * @param options 可选项,用于配置事件监听的行为。
 */
export declare function useEventListener<E extends keyof DocumentEventMap>(
  target: DocumentOrShadowRoot,
  event: Arrayable<E>,
  listener: Arrayable<(this: Document, ev: DocumentEventMap[E]) => any>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
 * 在挂载时使用 addEventListener 进行注册,并在卸载时自动使用 removeEventListener 进行移除。
 *
 * 重载 4:显式指定了 HTMLElement 目标
 *
 * @see https://vueuse.org/useEventListener
 * @param target HTMLElement 目标对象。
 * @param event 事件类型或事件类型数组。
 * @param listener 事件监听器。
 * @param options 可选项,用于配置事件监听的行为。
 */
export declare function useEventListener<E extends keyof HTMLElementEventMap>(
  target: MaybeRefOrGetter<HTMLElement | null | undefined>,
  event: Arrayable<E>,
  listener: (this: HTMLElement, ev: HTMLElementEventMap[E]) => any,
  options?: boolean | AddEventListenerOptions,
): () => void
/**
 * 在挂载时使用 addEventListener 进行注册,并在卸载时自动使用 removeEventListener 进行移除。
 *
 * 重载 5:自定义事件目标,并推断事件类型
 *
 * @see https://vueuse.org/useEventListener
 * @param target 自定义事件目标对象,根据事件名推断。
 * @param event 事件类型或事件类型数组。
 * @param listener 事件监听器或事件监听器数组。
 * @param options 可选项,用于配置事件监听的行为。
 */
export declare function useEventListener<
  Names extends string,
  EventType = Event,
>(
  target: MaybeRefOrGetter<InferEventTarget<Names> | null | undefined>,
  event: Arrayable<Names>,
  listener: Arrayable<GeneralEventListener<EventType>>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
 * 在挂载时使用 addEventListener 进行注册,并在卸载时自动使用 removeEventListener 进行移除。
 *
 * 重载 6:自定义事件目标,通用型
 *
 * @see https://vueuse.org/useEventListener
 * @param target 自定义事件目标对象。
 * @param event 事件类型或事件类型数组。
 * @param listener 事件监听器或事件监听器数组。
 * @param options 可选项,用于配置事件监听的行为。
 */
export declare function useEventListener<EventType = Event>(
  target: MaybeRefOrGetter<EventTarget | null | undefined>,
  event: Arrayable<string>,
  listener: Arrayable<GeneralEventListener<EventType>>,
  options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn

源码

源码文档

贡献者

Anthony Fu
一纸忘忧
丶远方
Anthony Fu
Forrest Li
陪我去看海吧
Julien Le Coupanec
Michael J. Roberts
James Garbutt
vaakian X
sun0day
Alejandro Arevalo
Jelf
Alex Kozack
lstoeferle
Antério Vieira

更新日志

v11.0.0-beta.2 on 7/17/2024
edab6 - fix: event target can be an empty ref/getter (#4014)
v10.8.0 on 2/20/2024
a086e - fix: stricter types
v10.4.1 on 8/28/2023
3ef59 - fix: immutable options on removal, close #2825 (#3346)
v10.3.0 on 7/30/2023
4f414 - fix: improved useEventListener overload (#3246)
v10.0.0-beta.5 on 4/13/2023
cb644 - refactor!: remove isFunction and isString utils
v10.0.0-beta.4 on 4/13/2023
4d757 - feat(types)!: rename MaybeComputedRef to MaybeRefOrGetter
0a72b - feat(toValue): rename resolveUnref to toValue
v9.13.0 on 2/18/2023
103d6 - feat: support reactive options
v9.10.0 on 1/3/2023
07f20 - feat(useActiveElement): support shadow roots (#2592)
v9.5.0 on 11/9/2022
ab0ee - feat: accept multiple events or listeners (#2180)