From e1495cb558292d810ccd1e2f251c4462e1823619 Mon Sep 17 00:00:00 2001 From: biubiukam Date: Sat, 29 Aug 2026 03:00:51 +0800 Subject: [PATCH 1/2] fix: unregister array trigger events on release --- .../unit/interaction/base-trigger.test.ts | 29 +++++++++++++++++++ .../vchart/src/interaction/triggers/base.ts | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 packages/vchart/__tests__/unit/interaction/base-trigger.test.ts diff --git a/packages/vchart/__tests__/unit/interaction/base-trigger.test.ts b/packages/vchart/__tests__/unit/interaction/base-trigger.test.ts new file mode 100644 index 0000000000..691c6fbeb5 --- /dev/null +++ b/packages/vchart/__tests__/unit/interaction/base-trigger.test.ts @@ -0,0 +1,29 @@ +import { BaseTrigger } from '../../../src/interaction/triggers/base'; +import type { IBaseTriggerOptions, ITriggerEventHandler } from '../../../src/interaction/interface/trigger'; +import type { IInteraction } from '../../../src/interaction/interface/common'; + +describe('BaseTrigger', () => { + it('unregisters every event in an array when released', () => { + const handler = jest.fn(); + const event = { + on: jest.fn(), + off: jest.fn(), + emit: jest.fn() + }; + const trigger = new (class extends BaseTrigger { + protected getEvents(): Array<{ type: string | string[]; handler: ITriggerEventHandler }> { + return [{ type: ['pointerdown', 'pointerup'], handler }]; + } + })({ event, interaction: {} as IInteraction }); + + trigger.init(); + event.on.mockClear(); + event.off.mockClear(); + + trigger.release(); + + expect(event.on).not.toHaveBeenCalled(); + expect(event.off).toHaveBeenNthCalledWith(1, 'pointerdown', handler); + expect(event.off).toHaveBeenNthCalledWith(2, 'pointerup', handler); + }); +}); diff --git a/packages/vchart/src/interaction/triggers/base.ts b/packages/vchart/src/interaction/triggers/base.ts index a80c390809..a9b2bbe9a3 100644 --- a/packages/vchart/src/interaction/triggers/base.ts +++ b/packages/vchart/src/interaction/triggers/base.ts @@ -102,7 +102,7 @@ export abstract class BaseTrigger implements ITri if (evt.type && evt.handler) { if (isArray(evt.type)) { evt.type.forEach(evtType => { - evtType && evtType !== 'none' && this.options.event.on(evtType, evt.handler); + evtType && evtType !== 'none' && this.options.event.off(evtType, evt.handler); }); } else { evt.type !== 'none' && this.options.event.off(evt.type, evt.handler); From f3c05341a7b390083bd485f2175dc0bfdc7836e4 Mon Sep 17 00:00:00 2001 From: biubiukam Date: Mon, 31 Aug 2026 22:09:52 +0800 Subject: [PATCH 2/2] chore: add changelog for array trigger release fix --- ...x-issue-4654-array-trigger-release_2026-08-31.json | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 common/changes/@visactor/vchart/fix-issue-4654-array-trigger-release_2026-08-31.json diff --git a/common/changes/@visactor/vchart/fix-issue-4654-array-trigger-release_2026-08-31.json b/common/changes/@visactor/vchart/fix-issue-4654-array-trigger-release_2026-08-31.json new file mode 100644 index 0000000000..3f1af2cd0d --- /dev/null +++ b/common/changes/@visactor/vchart/fix-issue-4654-array-trigger-release_2026-08-31.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "@visactor/vchart", + "comment": "fix: unregister array-valued trigger event listeners on release", + "type": "patch" + } + ], + "packageName": "@visactor/vchart", + "email": "biukam.w@gmail.com" +}