From 3ef59cb1725655ba58b7f307d835300ba1e89f5c Mon Sep 17 00:00:00 2001 From: Anthony Fu Date: Mon, 28 Aug 2023 05:54:35 +0200 Subject: [PATCH] fix(useEventListener): immutable options on removal, close #2825 (#3346) --- packages/core/useEventListener/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/core/useEventListener/index.ts b/packages/core/useEventListener/index.ts index d594adf815e..4f14aacd046 100644 --- a/packages/core/useEventListener/index.ts +++ b/packages/core/useEventListener/index.ts @@ -1,5 +1,5 @@ import type { Arrayable, Fn, MaybeRefOrGetter } from '@vueuse/shared' -import { noop, toValue, tryOnScopeDispose } from '@vueuse/shared' +import { isObject, noop, toValue, tryOnScopeDispose } from '@vueuse/shared' import { watch } from 'vue-demi' import type { MaybeElementRef } from '../unrefElement' import { unrefElement } from '../unrefElement' @@ -163,9 +163,11 @@ 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, options)) + return (listeners as Function[]).map(listener => register(el, event, listener, optionsClone)) }), ) },