diff --git a/CHANGELOG.md b/CHANGELOG.md index a89d4d5cc..e74fedefb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## Changes +- [event][https://pikax.me/vue-composable/composable/event/event.html] - improve typing - [path](https://pikax.me/vue-composable/composable/format/path) - Improve [array path access](https://pikax.me/vue-composable/composable/format/path.html#access) and add dev warnings - [i18n](https://pikax.me/vue-composable/composable/i18n/i18n) - Allow to have factory based locale messages - [i18n](https://pikax.me/vue-composable/composable/i18n/i18n) - Added console warnings when removing locales diff --git a/packages/web/__tests__/event/event.spec.ts b/packages/web/__tests__/event/event.spec.ts index fdb8f113d..3693c5859 100644 --- a/packages/web/__tests__/event/event.spec.ts +++ b/packages/web/__tests__/event/event.spec.ts @@ -1,5 +1,5 @@ import { Ref, ref } from "@vue/composition-api"; -import { Vue } from "../utils"; +import { Vue, nextTick } from "../utils"; import { useEvent } from "../../src"; import { NO_OP } from "@vue-composable/core"; @@ -140,4 +140,38 @@ describe("event", () => { it("should not throw if undefined passed", () => { expect(useEvent(undefined as any, "load", NO_OP)).toBe(NO_OP); }); + + it("should remove event listener if ref changes", async () => { + const element: Element = { + addEventListener: jest.fn(), + removeEventListener: jest.fn() + } as any; + const mockHandler = jest.fn(); + const options = {}; + + const el = ref(element); + + new Vue({ + template: "
", + setup() { + useEvent(el, "load", mockHandler, options); + } + }).$mount(); + expect(element.removeEventListener).not.toHaveBeenCalled(); + expect(element.addEventListener).toHaveBeenCalled(); + + el.value = { + ...element + }; + + await nextTick(); + + expect(element.removeEventListener).toHaveBeenCalled(); + expect(element.addEventListener).toHaveBeenCalledTimes(2); + + el.value = null as any; + + await nextTick(); + expect(element.removeEventListener).toHaveBeenCalledTimes(2); + }); }); diff --git a/packages/web/src/event/event.ts b/packages/web/src/event/event.ts index 1dc493cd2..4dac88876 100644 --- a/packages/web/src/event/event.ts +++ b/packages/web/src/event/event.ts @@ -14,7 +14,7 @@ export function useEvent< M, K extends keyof M >( - el: RefTyped