From 9dd86d0a8ddc82499731ed0e8bc76a456a538ead Mon Sep 17 00:00:00 2001 From: Yue JIN Date: Wed, 21 May 2025 12:18:43 +0800 Subject: [PATCH] refactor: change listeners from object to Map --- src/ECharts.ts | 56 +++++++++++++++++++++----------------------------- src/types.ts | 2 -- 2 files changed, 23 insertions(+), 35 deletions(-) diff --git a/src/ECharts.ts b/src/ECharts.ts index 31f3eea..86c79fc 100644 --- a/src/ECharts.ts +++ b/src/ECharts.ts @@ -28,7 +28,6 @@ import { register, TAG_NAME } from "./wc"; import type { PropType, InjectionKey } from "vue"; import type { EChartsType, - EventTarget, Option, Theme, ThemeInjection, @@ -93,7 +92,8 @@ export default defineComponent({ const nonEventAttrs = computed(() => omitOn(attrs)); const nativeListeners: Record = {}; - const listeners: Record = {}; + const listeners: Map<{ event: string; once?: boolean; zr?: boolean }, any> = + new Map(); // We are converting all `on` props and collect them into `listeners` so that // we can bind them to the chart instance later. @@ -102,28 +102,32 @@ export default defineComponent({ Object.keys(attrs) .filter(key => isOn(key)) .forEach(key => { - // onClick -> c + lick - // onZr:click -> z + r:click - let event = key.charAt(2).toLowerCase() + key.slice(3); - // Collect native DOM events - if (event.indexOf("native:") === 0) { - // native:click -> onClick - const nativeKey = `on${event.charAt(7).toUpperCase()}${event.slice( - 8 - )}`; + if (key.indexOf("Native:") === 2) { + // onNative:click -> onClick + const nativeKey = `on${key.charAt(9).toUpperCase()}${key.slice(10)}`; nativeListeners[nativeKey] = attrs[key]; return; } - // clickOnce -> ~click - // zr:clickOnce -> ~zr:click - if (event.substring(event.length - 4) === "Once") { - event = `~${event.substring(0, event.length - 4)}`; + // onClick -> c + lick + // onZr:click -> z + r:click + let event = key.charAt(2).toLowerCase() + key.slice(3); + + let zr: boolean | undefined; + if (event.indexOf("zr:") === 0) { + zr = true; + event = event.substring(3); } - listeners[event] = attrs[key]; + let once: boolean | undefined; + if (event.substring(event.length - 4) === "Once") { + once = true; + event = event.substring(0, event.length - 4); + } + + listeners.set({ event, zr, once }, attrs[key]); }); function init(option?: Option) { @@ -141,28 +145,14 @@ export default defineComponent({ instance.group = props.group; } - Object.keys(listeners).forEach(key => { - let handler = listeners[key]; - + listeners.forEach((handler, { zr, once, event }) => { if (!handler) { return; } - let event = key.toLowerCase(); - if (event.charAt(0) === "~") { - event = event.substring(1); - handler.__once__ = true; - } - - let target: EventTarget = instance; - if (event.indexOf("zr:") === 0) { - target = instance.getZr(); - event = event.substring(3); - } - - if (handler.__once__) { - delete handler.__once__; + const target = zr ? instance.getZr() : instance; + if (once) { const raw = handler; handler = (...args: any[]) => { diff --git a/src/types.ts b/src/types.ts index 97e82f7..b7f6bf7 100644 --- a/src/types.ts +++ b/src/types.ts @@ -26,8 +26,6 @@ export type UpdateOptions = SetOptionOpts; export type UpdateOptionsInjection = Injection; export type EChartsType = ReturnType; -type ZRenderType = ReturnType; -export type EventTarget = EChartsType | ZRenderType; type SetOptionType = EChartsType["setOption"]; export type Option = Parameters[0];