From da4a4fb5e8eee3c6d31f24ebd79a9d0feca56cb2 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 30 Nov 2023 19:00:00 +0800 Subject: [PATCH] perf(runtime-dom): cache modifier wrapper functions close #8882 --- packages/runtime-dom/src/directives/vOn.ts | 88 ++++++++++++---------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/packages/runtime-dom/src/directives/vOn.ts b/packages/runtime-dom/src/directives/vOn.ts index 06e596266cf..b1f4492e0ac 100644 --- a/packages/runtime-dom/src/directives/vOn.ts +++ b/packages/runtime-dom/src/directives/vOn.ts @@ -32,14 +32,20 @@ const modifierGuards: Record< /** * @private */ -export const withModifiers = (fn: Function, modifiers: string[]) => { - return (event: Event, ...args: unknown[]) => { - for (let i = 0; i < modifiers.length; i++) { - const guard = modifierGuards[modifiers[i]] - if (guard && guard(event, modifiers)) return - } - return fn(event, ...args) - } +export const withModifiers = ( + fn: Function & { _withMods?: Function }, + modifiers: string[] +) => { + return ( + fn._withMods || + (fn._withMods = (event: Event, ...args: unknown[]) => { + for (let i = 0; i < modifiers.length; i++) { + const guard = modifierGuards[modifiers[i]] + if (guard && guard(event, modifiers)) return + } + return fn(event, ...args) + }) + ) } // Kept for 2.x compat. @@ -57,7 +63,10 @@ const keyNames: Record = { /** * @private */ -export const withKeys = (fn: Function, modifiers: string[]) => { +export const withKeys = ( + fn: Function & { _withKeys?: Function }, + modifiers: string[] +) => { let globalKeyCodes: LegacyConfig['keyCodes'] let instance: ComponentInternalInstance | null = null if (__COMPAT__) { @@ -77,40 +86,43 @@ export const withKeys = (fn: Function, modifiers: string[]) => { } } - return (event: KeyboardEvent) => { - if (!('key' in event)) { - return - } - - const eventKey = hyphenate(event.key) - if (modifiers.some(k => k === eventKey || keyNames[k] === eventKey)) { - return fn(event) - } + return ( + fn._withKeys || + (fn._withKeys = (event: KeyboardEvent) => { + if (!('key' in event)) { + return + } - if (__COMPAT__) { - const keyCode = String(event.keyCode) - if ( - compatUtils.isCompatEnabled( - DeprecationTypes.V_ON_KEYCODE_MODIFIER, - instance - ) && - modifiers.some(mod => mod == keyCode) - ) { + const eventKey = hyphenate(event.key) + if (modifiers.some(k => k === eventKey || keyNames[k] === eventKey)) { return fn(event) } - if (globalKeyCodes) { - for (const mod of modifiers) { - const codes = globalKeyCodes[mod] - if (codes) { - const matches = isArray(codes) - ? codes.some(code => String(code) === keyCode) - : String(codes) === keyCode - if (matches) { - return fn(event) + + if (__COMPAT__) { + const keyCode = String(event.keyCode) + if ( + compatUtils.isCompatEnabled( + DeprecationTypes.V_ON_KEYCODE_MODIFIER, + instance + ) && + modifiers.some(mod => mod == keyCode) + ) { + return fn(event) + } + if (globalKeyCodes) { + for (const mod of modifiers) { + const codes = globalKeyCodes[mod] + if (codes) { + const matches = isArray(codes) + ? codes.some(code => String(code) === keyCode) + : String(codes) === keyCode + if (matches) { + return fn(event) + } } } } } - } - } + }) + ) }