expect(onError).not.toHaveBeenCalled()
})
+ test('case conversion for vnode hooks', () => {
+ const { node } = parseWithVOn(`<div v-on:vnode-mounted="onMount"/>`)
+ const props = (node.codegenNode as CallExpression)
+ .arguments[1] as ObjectExpression
+ expect(props.properties[0]).toMatchObject({
+ key: {
+ content: `onVnodeMounted`
+ },
+ value: {
+ content: `onMount`
+ }
+ })
+ })
+
describe('cacheHandler', () => {
test('empty handler', () => {
const { root, node } = parseWithVOn(`<div v-on:click.prevent />`, {
createCompoundExpression,
SimpleExpressionNode
} from '../ast'
-import { capitalize } from '@vue/shared'
+import { capitalize, camelize } from '@vue/shared'
import { createCompilerError, ErrorCodes } from '../errors'
import { processExpression } from './transformExpression'
import { isMemberExpression, hasScopeRef } from '../utils'
let eventName: ExpressionNode
if (arg.type === NodeTypes.SIMPLE_EXPRESSION) {
if (arg.isStatic) {
- eventName = createSimpleExpression(
- `on${capitalize(arg.content)}`,
- true,
- arg.loc
- )
+ const rawName = arg.content
+ // for @vnode-xxx event listeners, auto convert it to camelCase
+ const normalizedName = rawName.startsWith(`vnode`)
+ ? capitalize(camelize(rawName))
+ : capitalize(rawName)
+ eventName = createSimpleExpression(`on${normalizedName}`, true, arg.loc)
} else {
eventName = createCompoundExpression([`"on" + (`, arg, `)`])
}