From 8be8a1d0ef36c6273c96bb99c12bd467dbee44aa Mon Sep 17 00:00:00 2001 From: Helios Date: Tue, 13 Oct 2020 00:42:15 +0800 Subject: [PATCH 1/2] fix(compiler-core): merge props when use v-if with v-on --- .../__tests__/transforms/vIf.spec.ts | 42 ++++++++++++++----- packages/compiler-core/src/utils.ts | 16 +++++-- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/vIf.spec.ts b/packages/compiler-core/__tests__/transforms/vIf.spec.ts index a21ab1f019b..cb2b5a0df20 100644 --- a/packages/compiler-core/__tests__/transforms/vIf.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vIf.spec.ts @@ -4,25 +4,25 @@ import { transformIf } from '../../src/transforms/vIf' 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' @@ -673,4 +673,24 @@ describe('compiler: v-if', () => { expect((b1.children[3] as ElementNode).tag).toBe(`p`) }) }) + + test('v-on with v-if', () => { + const { + node: { codegenNode } + } = parseWithIfTransform( + `` + ) + + 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].callee).toBe( + TO_HANDLERS + ) + expect( + (codegenNode.consequent as any).props.arguments[1].properties[0].value + .content + ).toBe('0') + }) }) diff --git a/packages/compiler-core/src/utils.ts b/packages/compiler-core/src/utils.ts index 201ebe63aa3..12c602946f2 100644 --- a/packages/compiler-core/src/utils.ts +++ b/packages/compiler-core/src/utils.ts @@ -29,7 +29,8 @@ import { TELEPORT, SUSPENSE, KEEP_ALIVE, - BASE_TRANSITION + BASE_TRANSITION, + TO_HANDLERS } from './runtimeHelpers' import { isString, isObject, hyphenate, extend } from '@vue/shared' @@ -215,7 +216,7 @@ export function injectProp( 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)) { @@ -228,9 +229,16 @@ export function injectProp( if (!isString(first) && first.type === NodeTypes.JS_OBJECT_EXPRESSION) { first.properties.unshift(prop) } else { - props.arguments.unshift(createObjectExpression([prop])) + if (props.callee === TO_HANDLERS) { + propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [ + props, + createObjectExpression([prop]) + ]) + } 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 From c588c4e79928bd78767f1ba7e554dc0aee5377e4 Mon Sep 17 00:00:00 2001 From: Helios Date: Tue, 13 Oct 2020 13:28:37 +0800 Subject: [PATCH 2/2] fix(compiler-core): merge props when use v-if with v-on --- packages/compiler-core/__tests__/transforms/vIf.spec.ts | 8 ++++---- packages/compiler-core/src/utils.ts | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/vIf.spec.ts b/packages/compiler-core/__tests__/transforms/vIf.spec.ts index cb2b5a0df20..f1b91cc4567 100644 --- a/packages/compiler-core/__tests__/transforms/vIf.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vIf.spec.ts @@ -685,12 +685,12 @@ describe('compiler: v-if', () => { NodeTypes.JS_CALL_EXPRESSION ) expect((codegenNode.consequent as any).props.callee).toBe(MERGE_PROPS) - expect((codegenNode.consequent as any).props.arguments[0].callee).toBe( - TO_HANDLERS - ) expect( - (codegenNode.consequent as any).props.arguments[1].properties[0].value + (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 + ) }) }) diff --git a/packages/compiler-core/src/utils.ts b/packages/compiler-core/src/utils.ts index 12c602946f2..efc97f5d4c4 100644 --- a/packages/compiler-core/src/utils.ts +++ b/packages/compiler-core/src/utils.ts @@ -230,9 +230,10 @@ export function injectProp( first.properties.unshift(prop) } else { if (props.callee === TO_HANDLERS) { + // #2366 propsWithInjection = createCallExpression(context.helper(MERGE_PROPS), [ - props, - createObjectExpression([prop]) + createObjectExpression([prop]), + props ]) } else { props.arguments.unshift(createObjectExpression([prop]))