From fc5c10a4c6b7921739e24be97533ee3107959da0 Mon Sep 17 00:00:00 2001 From: Wu Shuwen <108231307+dajiaohuang@users.noreply.github.com> Date: Tue, 25 Aug 2026 04:15:20 +0800 Subject: [PATCH] fix: unbind array trigger events on release --- .../unit/interaction/base-trigger.test.ts | 34 +++++++++++++++++++ .../vchart/src/interaction/triggers/base.ts | 2 +- 2 files changed, 35 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..5cc102561b --- /dev/null +++ b/packages/vchart/__tests__/unit/interaction/base-trigger.test.ts @@ -0,0 +1,34 @@ +import { BaseTrigger } from '../../../src/interaction/triggers/base'; +import type { IBaseTriggerOptions, ITriggerEventHandler } from '../../../src/interaction/interface/trigger'; + +class TestTrigger extends BaseTrigger { + type = 'test'; + readonly handler = jest.fn(); + + protected getEvents(): Array<{ type: string | string[]; handler: ITriggerEventHandler }> { + return [{ type: ['pointerdown', 'none', 'pointermove'], handler: this.handler }]; + } +} + +describe('BaseTrigger', () => { + it('unbinds every event in an array-valued trigger when released', () => { + const event = { + on: jest.fn(), + off: jest.fn(), + emit: jest.fn() + }; + const trigger = new TestTrigger({ event, interaction: {} as IBaseTriggerOptions['interaction'] }); + + trigger.init(); + trigger.release(); + + expect(event.on.mock.calls).toEqual([ + ['pointerdown', trigger.handler], + ['pointermove', trigger.handler] + ]); + expect(event.off.mock.calls).toEqual([ + ['pointerdown', trigger.handler], + ['pointermove', trigger.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);