Skip to content

Commit 434dca8

Browse files
committed
refactor: change listeners from object to Map
1 parent ea4325e commit 434dca8

File tree

1 file changed

+22
-32
lines changed

1 file changed

+22
-32
lines changed

src/ECharts.ts

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import { register, TAG_NAME } from "./wc";
2828
import type { PropType, InjectionKey } from "vue";
2929
import type {
3030
EChartsType,
31-
EventTarget,
3231
Option,
3332
Theme,
3433
ThemeInjection,
@@ -93,7 +92,8 @@ export default defineComponent({
9392
const nonEventAttrs = computed(() => omitOn(attrs));
9493
const nativeListeners: Record<string, unknown> = {};
9594

96-
const listeners: Record<string, any> = {};
95+
const listeners: Map<{ event: string; once?: boolean; zr?: boolean }, any> =
96+
new Map();
9797

9898
// We are converting all `on<Event>` props and collect them into `listeners` so that
9999
// we can bind them to the chart instance later.
@@ -102,28 +102,32 @@ export default defineComponent({
102102
Object.keys(attrs)
103103
.filter(key => isOn(key))
104104
.forEach(key => {
105-
// onClick -> c + lick
106-
// onZr:click -> z + r:click
107-
let event = key.charAt(2).toLowerCase() + key.slice(3);
108-
109105
// Collect native DOM events
110-
if (event.indexOf("native:") === 0) {
111-
// native:click -> onClick
112-
const nativeKey = `on${event.charAt(7).toUpperCase()}${event.slice(
113-
8
114-
)}`;
106+
if (key.indexOf("Native:") === 2) {
107+
// onNative:click -> onClick
108+
const nativeKey = `on${key.charAt(9).toUpperCase()}${key.slice(10)}`;
115109

116110
nativeListeners[nativeKey] = attrs[key];
117111
return;
118112
}
119113

120-
// clickOnce -> ~click
121-
// zr:clickOnce -> ~zr:click
114+
// onClick -> c + lick
115+
// onZr:click -> z + r:click
116+
let event = key.charAt(2).toLowerCase() + key.slice(3);
117+
118+
let zr: boolean | undefined;
119+
if (event.indexOf("zr:") === 0) {
120+
zr = true;
121+
event = event.substring(3);
122+
}
123+
124+
let once: boolean | undefined;
122125
if (event.substring(event.length - 4) === "Once") {
123-
event = `~${event.substring(0, event.length - 4)}`;
126+
once = true;
127+
event = event.substring(0, event.length - 4);
124128
}
125129

126-
listeners[event] = attrs[key];
130+
listeners.set({ event, zr, once }, attrs[key]);
127131
});
128132

129133
function init(option?: Option) {
@@ -141,28 +145,14 @@ export default defineComponent({
141145
instance.group = props.group;
142146
}
143147

144-
Object.keys(listeners).forEach(key => {
145-
let handler = listeners[key];
146-
148+
listeners.forEach((handler, { zr, once, event }) => {
147149
if (!handler) {
148150
return;
149151
}
150152

151-
let event = key.toLowerCase();
152-
if (event.charAt(0) === "~") {
153-
event = event.substring(1);
154-
handler.__once__ = true;
155-
}
156-
157-
let target: EventTarget = instance;
158-
if (event.indexOf("zr:") === 0) {
159-
target = instance.getZr();
160-
event = event.substring(3);
161-
}
162-
163-
if (handler.__once__) {
164-
delete handler.__once__;
153+
const target = zr ? instance.getZr() : instance;
165154

155+
if (once) {
166156
const raw = handler;
167157

168158
handler = (...args: any[]) => {

0 commit comments

Comments
 (0)