fix(v-on): capitalize dynamic event names

This commit is contained in:
Evan You 2020-07-13 17:36:46 -04:00
parent 576344d2c3
commit 9152a89016
5 changed files with 23 additions and 16 deletions

View File

@ -22,6 +22,7 @@ export const TO_DISPLAY_STRING = Symbol(__DEV__ ? `toDisplayString` : ``)
export const MERGE_PROPS = Symbol(__DEV__ ? `mergeProps` : ``) export const MERGE_PROPS = Symbol(__DEV__ ? `mergeProps` : ``)
export const TO_HANDLERS = Symbol(__DEV__ ? `toHandlers` : ``) export const TO_HANDLERS = Symbol(__DEV__ ? `toHandlers` : ``)
export const CAMELIZE = Symbol(__DEV__ ? `camelize` : ``) export const CAMELIZE = Symbol(__DEV__ ? `camelize` : ``)
export const CAPITALIZE = Symbol(__DEV__ ? `capitalize` : ``)
export const SET_BLOCK_TRACKING = Symbol(__DEV__ ? `setBlockTracking` : ``) export const SET_BLOCK_TRACKING = Symbol(__DEV__ ? `setBlockTracking` : ``)
export const PUSH_SCOPE_ID = Symbol(__DEV__ ? `pushScopeId` : ``) export const PUSH_SCOPE_ID = Symbol(__DEV__ ? `pushScopeId` : ``)
export const POP_SCOPE_ID = Symbol(__DEV__ ? `popScopeId` : ``) export const POP_SCOPE_ID = Symbol(__DEV__ ? `popScopeId` : ``)
@ -54,6 +55,7 @@ export const helperNameMap: any = {
[MERGE_PROPS]: `mergeProps`, [MERGE_PROPS]: `mergeProps`,
[TO_HANDLERS]: `toHandlers`, [TO_HANDLERS]: `toHandlers`,
[CAMELIZE]: `camelize`, [CAMELIZE]: `camelize`,
[CAPITALIZE]: `capitalize`,
[SET_BLOCK_TRACKING]: `setBlockTracking`, [SET_BLOCK_TRACKING]: `setBlockTracking`,
[PUSH_SCOPE_ID]: `pushScopeId`, [PUSH_SCOPE_ID]: `pushScopeId`,
[POP_SCOPE_ID]: `popScopeId`, [POP_SCOPE_ID]: `popScopeId`,

View File

@ -14,6 +14,7 @@ import { createCompilerError, ErrorCodes } from '../errors'
import { processExpression } from './transformExpression' import { processExpression } from './transformExpression'
import { validateBrowserExpression } from '../validateExpression' import { validateBrowserExpression } from '../validateExpression'
import { isMemberExpression, hasScopeRef } from '../utils' import { isMemberExpression, hasScopeRef } from '../utils'
import { CAPITALIZE } from '../runtimeHelpers'
const fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/ const fnExpRE = /^([\w$_]+|\([^)]*?\))\s*=>|^function(?:\s+[\w$]+)?\s*\(/
@ -47,12 +48,16 @@ export const transformOn: DirectiveTransform = (
: capitalize(rawName) : capitalize(rawName)
eventName = createSimpleExpression(`on${normalizedName}`, true, arg.loc) eventName = createSimpleExpression(`on${normalizedName}`, true, arg.loc)
} else { } else {
eventName = createCompoundExpression([`"on" + (`, arg, `)`]) eventName = createCompoundExpression([
`"on" + ${context.helperString(CAPITALIZE)}(`,
arg,
`)`
])
} }
} else { } else {
// already a compound expression. // already a compound expression.
eventName = arg eventName = arg
eventName.children.unshift(`"on" + (`) eventName.children.unshift(`"on" + ${context.helperString(CAPITALIZE)}(`)
eventName.children.push(`)`) eventName.children.push(`)`)
} }

View File

@ -225,19 +225,7 @@ export {
createCommentVNode, createCommentVNode,
createStaticVNode createStaticVNode
} from './vnode' } from './vnode'
export { toDisplayString, camelize, capitalize } from '@vue/shared'
// a bit of ceremony to mark these internal only here because we need to include
// them in @vue/shared's typings
import { toDisplayString, camelize } from '@vue/shared'
/**
* @private
*/
const _toDisplayString = toDisplayString
/**
* @private
*/
const _camelize = camelize
export { _toDisplayString as toDisplayString, _camelize as camelize }
// For test-utils // For test-utils
export { transformVNodeArgs } from './vnode' export { transformVNodeArgs } from './vnode'

View File

@ -94,6 +94,9 @@ const cacheStringFunction = <T extends (str: string) => string>(fn: T): T => {
} }
const camelizeRE = /-(\w)/g const camelizeRE = /-(\w)/g
/**
* @private
*/
export const camelize = cacheStringFunction( export const camelize = cacheStringFunction(
(str: string): string => { (str: string): string => {
return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : '')) return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''))
@ -101,12 +104,18 @@ export const camelize = cacheStringFunction(
) )
const hyphenateRE = /\B([A-Z])/g const hyphenateRE = /\B([A-Z])/g
/**
* @private
*/
export const hyphenate = cacheStringFunction( export const hyphenate = cacheStringFunction(
(str: string): string => { (str: string): string => {
return str.replace(hyphenateRE, '-$1').toLowerCase() return str.replace(hyphenateRE, '-$1').toLowerCase()
} }
) )
/**
* @private
*/
export const capitalize = cacheStringFunction( export const capitalize = cacheStringFunction(
(str: string): string => { (str: string): string => {
return str.charAt(0).toUpperCase() + str.slice(1) return str.charAt(0).toUpperCase() + str.slice(1)

View File

@ -1,6 +1,9 @@
import { isArray, isObject, isPlainObject } from './index' import { isArray, isObject, isPlainObject } from './index'
// For converting {{ interpolation }} values to displayed strings. /**
* For converting {{ interpolation }} values to displayed strings.
* @private
*/
export const toDisplayString = (val: unknown): string => { export const toDisplayString = (val: unknown): string => {
return val == null return val == null
? '' ? ''