wip: keyCode compat

This commit is contained in:
Evan You 2021-04-06 17:38:43 -04:00
parent 2784d6615d
commit 068d93b9e5
3 changed files with 53 additions and 9 deletions

View File

@ -29,7 +29,9 @@ export const enum DeprecationTypes {
PROPS_DEFAULT_THIS,
CUSTOM_DIR
CUSTOM_DIR,
V_ON_KEYCODE_MODIFIER
}
type DeprecationData = {
@ -190,6 +192,13 @@ const deprecations: Record<DeprecationTypes, DeprecationData> = {
`Custom directive hook "${legacyHook}" has been removed. ` +
`Use "${newHook}" instead.`,
link: `https://v3.vuejs.org/guide/migration/custom-directives.html`
},
[DeprecationTypes.V_ON_KEYCODE_MODIFIER]: {
message:
`Using keyCode as v-on modifier is no longer supported. ` +
`Use kebab-case key name modifiers instead.`,
link: `https://v3.vuejs.org/guide/migration/keycode-modifiers.html`
}
}

View File

@ -286,3 +286,4 @@ export const ssrUtils = (__NODE_JS__ ? _ssrUtils : null) as typeof _ssrUtils
// checks
export { warnDeprecation, DeprecationTypes } from './compat/deprecations'
export { createCompatVue, CompatVue } from './compat/global'
export { LegacyConfig } from './compat/globalConfig'

View File

@ -1,4 +1,10 @@
import { hyphenate } from '@vue/shared'
import {
DeprecationTypes,
warnDeprecation,
getCurrentInstance,
LegacyConfig
} from '@vue/runtime-core'
import { hyphenate, isArray } from '@vue/shared'
const systemModifiers = ['ctrl', 'shift', 'alt', 'meta']
@ -51,15 +57,43 @@ const keyNames: Record<string, string | string[]> = {
* @private
*/
export const withKeys = (fn: Function, modifiers: string[]) => {
let keyCodes: LegacyConfig['keyCodes']
if (__COMPAT__) {
keyCodes = ((getCurrentInstance()!.appContext
.config as any) as LegacyConfig).keyCodes
if (__DEV__ && modifiers.some(m => /^\d+$/.test(m))) {
warnDeprecation(DeprecationTypes.V_ON_KEYCODE_MODIFIER)
}
}
return (event: KeyboardEvent) => {
if (!('key' in event)) return
const eventKey = hyphenate(event.key)
if (
// None of the provided key modifiers match the current event key
!modifiers.some(k => k === eventKey || keyNames[k] === eventKey)
) {
if (!('key' in event)) {
return
}
return fn(event)
const eventKey = hyphenate(event.key)
if (modifiers.some(k => k === eventKey || keyNames[k] === eventKey)) {
return fn(event)
}
if (__COMPAT__) {
const keyCode = String(event.keyCode)
if (modifiers.some(mod => mod == keyCode)) {
return fn(event)
}
if (keyCodes) {
for (const mod of modifiers) {
const codes = keyCodes[mod]
if (codes) {
const matches = isArray(codes)
? codes.some(code => String(code) === keyCode)
: String(codes) === keyCode
if (matches) {
return fn(event)
}
}
}
}
}
}
}