import { transformElement } from '../../src/transforms/transformElement'
import { transformSlotOutlet } from '../../src/transforms/transformSlotOutlet'
import {
- IfNode,
- NodeTypes,
- ElementNode,
- TextNode,
CommentNode,
- SimpleExpressionNode,
ConditionalExpression,
- IfConditionalExpression,
- VNodeCall,
+ ElementNode,
ElementTypes,
- IfBranchNode
+ IfBranchNode,
+ IfConditionalExpression,
+ IfNode,
+ NodeTypes,
+ SimpleExpressionNode,
+ TextNode,
+ VNodeCall
} from '../../src/ast'
import { ErrorCodes } from '../../src/errors'
-import { CompilerOptions, generate } from '../../src'
+import { CompilerOptions, generate, TO_HANDLERS } from '../../src'
import {
+ CREATE_COMMENT,
FRAGMENT,
MERGE_PROPS,
- RENDER_SLOT,
- CREATE_COMMENT
+ RENDER_SLOT
} from '../../src/runtimeHelpers'
import { createObjectMatcher } from '../testUtils'
expect((b1.children[3] as ElementNode).tag).toBe(`p`)
})
})
+
+ test('v-on with v-if', () => {
+ const {
+ node: { codegenNode }
+ } = parseWithIfTransform(
+ `<button v-on="{ click: clickEvent }" v-if="true">w/ v-if</button>`
+ )
+
+ expect((codegenNode.consequent as any).props.type).toBe(
+ NodeTypes.JS_CALL_EXPRESSION
+ )
+ expect((codegenNode.consequent as any).props.callee).toBe(MERGE_PROPS)
+ expect(
+ (codegenNode.consequent as any).props.arguments[0].properties[0].value
+ .content
+ ).toBe('0')
+ expect((codegenNode.consequent as any).props.arguments[1].callee).toBe(
+ TO_HANDLERS
+ )
+ })
})
TELEPORT,
SUSPENSE,
KEEP_ALIVE,
- BASE_TRANSITION
+ BASE_TRANSITION,
+ TO_HANDLERS
} from './runtimeHelpers'
import { isString, isObject, hyphenate, extend } from '@vue/shared'
prop: Property,
context: TransformContext
) {
- let propsWithInjection: ObjectExpression | CallExpression
+ let propsWithInjection: ObjectExpression | CallExpression | undefined
const props =
node.type === NodeTypes.VNODE_CALL ? node.props : node.arguments[2]
if (props == null || isString(props)) {
if (!isString(first) && first.type === NodeTypes.JS_OBJECT_EXPRESSION) {
first.properties.unshift(prop)
} else {
- props.arguments.unshift(createObjectExpression([prop]))
+ if (props.callee === TO_HANDLERS) {
+ // #2366
+ propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [
+ createObjectExpression([prop]),
+ props
+ ])
+ } else {
+ props.arguments.unshift(createObjectExpression([prop]))
+ }
}
- propsWithInjection = props
+ !propsWithInjection && (propsWithInjection = props)
} else if (props.type === NodeTypes.JS_OBJECT_EXPRESSION) {
let alreadyExists = false
// check existing key to avoid overriding user provided keys