From f16c5dbc31354a9844ad45575092fe122a9cffcd Mon Sep 17 00:00:00 2001 From: btea <2356281422@qq.com> Date: Sat, 4 May 2024 15:17:45 +0800 Subject: [PATCH] feat(useEventListener): support multiple options --- packages/core/useEventListener/index.ts | 32 +++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/core/useEventListener/index.ts b/packages/core/useEventListener/index.ts index 782dff805ce..1e6ef1596d5 100644 --- a/packages/core/useEventListener/index.ts +++ b/packages/core/useEventListener/index.ts @@ -1,6 +1,7 @@ import type { Arrayable, Fn, MaybeRefOrGetter } from '@vueuse/shared' import { isObject, noop, toValue, tryOnScopeDispose } from '@vueuse/shared' import { watch } from 'vue-demi' +import type { Ref } from 'vue-demi' import type { MaybeElementRef } from '../unrefElement' import { unrefElement } from '../unrefElement' import { defaultWindow } from '../_configurable' @@ -12,6 +13,7 @@ interface InferEventTarget { export type WindowEventName = keyof WindowEventMap export type DocumentEventName = keyof DocumentEventMap +export type RefOrGetter = Ref | (() => T) export interface GeneralEventListener { (evt: E): void @@ -30,7 +32,7 @@ export interface GeneralEventListener { export function useEventListener( event: Arrayable, listener: Arrayable<(this: Window, ev: WindowEventMap[E]) => any>, - options?: MaybeRefOrGetter + options?: Arrayable> ): Fn /** @@ -48,7 +50,7 @@ export function useEventListener( target: Window, event: Arrayable, listener: Arrayable<(this: Window, ev: WindowEventMap[E]) => any>, - options?: MaybeRefOrGetter + options?: Arrayable> ): Fn /** @@ -66,7 +68,7 @@ export function useEventListener( target: DocumentOrShadowRoot, event: Arrayable, listener: Arrayable<(this: Document, ev: DocumentEventMap[E]) => any>, - options?: MaybeRefOrGetter + options?: Arrayable> ): Fn /** @@ -84,7 +86,7 @@ export function useEventListener( target: MaybeRefOrGetter, event: Arrayable, listener: (this: HTMLElement, ev: HTMLElementEventMap[E]) => any, - options?: boolean | AddEventListenerOptions + options?: Arrayable ): () => void /** @@ -102,7 +104,7 @@ export function useEventListener( target: InferEventTarget, event: Arrayable, listener: Arrayable>, - options?: MaybeRefOrGetter + options?: Arrayable> ): Fn /** @@ -120,14 +122,14 @@ export function useEventListener( target: MaybeRefOrGetter, event: Arrayable, listener: Arrayable>, - options?: MaybeRefOrGetter + options?: Arrayable> ): Fn export function useEventListener(...args: any[]) { let target: MaybeRefOrGetter | undefined let events: Arrayable let listeners: Arrayable - let options: MaybeRefOrGetter | undefined + let options: Arrayable> | undefined if (typeof args[0] === 'string' || Array.isArray(args[0])) { [events, listeners, options] = args @@ -163,11 +165,21 @@ export function useEventListener(...args: any[]) { if (!el) return - // create a clone of options, to avoid it being changed reactively on removal - const optionsClone = isObject(options) ? { ...options } : options cleanups.push( ...(events as string[]).flatMap((event) => { - return (listeners as Function[]).map(listener => register(el, event, listener, optionsClone)) + return (listeners as Function[]).map((listener, index) => { + let option: MaybeRefOrGetter | undefined + if (Array.isArray(options)) { + option = options[index] + if (option && isObject(option)) + option = { ...option } + } + else { + // create a clone of options, to avoid it being changed reactively on removal + option = isObject(options) ? { ...(options as RefOrGetter | MaybeRefOrGetter) } : options as boolean | undefined + } + return register(el, event, listener, option) + }) }), ) },