useEventListener
輕鬆使用 EventListener。在 mounted 時使用 addEventListener 註冊,並在 unmounted 時自動 removeEventListener。
用法
js
import { useEventListener } from '@vueuse/core'
useEventListener(document, 'visibilitychange', (evt) => {
console.log(evt)
})
您也可以傳遞 ref 作為事件目標,useEventListener
將在您更改目標時取消註冊先前的事件並註冊新的事件。
ts
import { useEventListener } from '@vueuse/core'
import { useTemplateRef } from 'vue'
const element = useTemplateRef<HTMLDivElement>('element')
useEventListener(element, 'keydown', (e) => {
console.log(e.key)
})
js
import { useEventListener } from '@vueuse/core'
import { useTemplateRef } from 'vue'
const element = useTemplateRef('element')
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() // This will unregister the listener.
請注意,如果您的組件也在 SSR(伺服器端渲染)中運行,您可能會收到錯誤(例如 document is not defined
),因為像 document
和 window
這樣的 DOM API 在 Node.js 中不可用。為了避免這種情況,您可以將邏輯放在 onMounted
鉤子中。
ts
// onMounted will only be called in the client side, so it guarantees the DOM APIs are available.
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
}
/**
* Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
*
* Overload 1: Omitted Window target
*
* @see https://vueuse.dev.org.tw/useEventListener
* @param event
* @param listener
* @param options
*/
export declare function useEventListener<E extends keyof WindowEventMap>(
event: MaybeRefOrGetter<Arrayable<E>>,
listener: MaybeRef<Arrayable<(this: Window, ev: WindowEventMap[E]) => any>>,
options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
* Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
*
* Overload 2: Explicitly Window target
*
* @see https://vueuse.dev.org.tw/useEventListener
* @param target
* @param event
* @param listener
* @param options
*/
export declare function useEventListener<E extends keyof WindowEventMap>(
target: Window,
event: MaybeRefOrGetter<Arrayable<E>>,
listener: MaybeRef<Arrayable<(this: Window, ev: WindowEventMap[E]) => any>>,
options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
* Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
*
* Overload 3: Explicitly Document target
*
* @see https://vueuse.dev.org.tw/useEventListener
* @param target
* @param event
* @param listener
* @param options
*/
export declare function useEventListener<E extends keyof DocumentEventMap>(
target: DocumentOrShadowRoot,
event: MaybeRefOrGetter<Arrayable<E>>,
listener: MaybeRef<
Arrayable<(this: Document, ev: DocumentEventMap[E]) => any>
>,
options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
* Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
*
* Overload 4: Explicitly HTMLElement target
*
* @see https://vueuse.dev.org.tw/useEventListener
* @param target
* @param event
* @param listener
* @param options
*/
export declare function useEventListener<E extends keyof HTMLElementEventMap>(
target: MaybeRefOrGetter<Arrayable<HTMLElement> | null | undefined>,
event: MaybeRefOrGetter<Arrayable<E>>,
listener: MaybeRef<(this: HTMLElement, ev: HTMLElementEventMap[E]) => any>,
options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): () => void
/**
* Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
*
* Overload 5: Custom event target with event type infer
*
* @see https://vueuse.dev.org.tw/useEventListener
* @param target
* @param event
* @param listener
* @param options
*/
export declare function useEventListener<
Names extends string,
EventType = Event,
>(
target: MaybeRefOrGetter<
Arrayable<InferEventTarget<Names>> | null | undefined
>,
event: MaybeRefOrGetter<Arrayable<Names>>,
listener: MaybeRef<Arrayable<GeneralEventListener<EventType>>>,
options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
/**
* Register using addEventListener on mounted, and removeEventListener automatically on unmounted.
*
* Overload 6: Custom event target fallback
*
* @see https://vueuse.dev.org.tw/useEventListener
* @param target
* @param event
* @param listener
* @param options
*/
export declare function useEventListener<EventType = Event>(
target: MaybeRefOrGetter<Arrayable<EventTarget> | null | undefined>,
event: MaybeRefOrGetter<Arrayable<string>>,
listener: MaybeRef<Arrayable<GeneralEventListener<EventType>>>,
options?: MaybeRefOrGetter<boolean | AddEventListenerOptions>,
): Fn
原始碼
貢獻者
變更日誌
v12.8.0
於 2025/3/5v12.5.0
於 2025/1/22v12.3.0
於 2025/1/259f75
- feat(toValue): 棄用 @vueuse/shared
中的 toValue
,改用 Vue 的原生方法v12.0.0-beta.1
於 2024/11/21v11.0.0-beta.2
於 2024/7/17v10.8.0
於 2024/2/20a086e
- fix: 更嚴格的類型v10.4.1
於 2023/8/28v10.3.0
於 2023/7/30v10.0.0-beta.5
於 2023/4/13cb644
- refactor!: 移除 isFunction
和 isString
工具函數v10.0.0-beta.4
於 2023/4/134d757
- feat(types)!: 將 MaybeComputedRef
重命名為 MaybeRefOrGetter
0a72b
- feat(toValue): 將 resolveUnref
重命名為 toValue
v9.13.0
於 2023/2/18103d6
- feat: 支援響應式選項