diff --git a/packages/compiler-ssr/__tests__/ssrComponent.spec.ts b/packages/compiler-ssr/__tests__/ssrComponent.spec.ts index d7ceb0bcb3c..2e7e82d5aa0 100644 --- a/packages/compiler-ssr/__tests__/ssrComponent.spec.ts +++ b/packages/compiler-ssr/__tests__/ssrComponent.spec.ts @@ -313,13 +313,15 @@ describe('ssr: components', () => { test('with static tag', () => { expect( compile( - `
` + `
` ).code ).toMatchInlineSnapshot(` - "const { ssrRenderList: _ssrRenderList } = require(\\"vue/server-renderer\\") + "const { ssrRenderAttrs: _ssrRenderAttrs, ssrRenderList: _ssrRenderList } = require(\\"vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent, _attrs) { - _push(\`
    \`) + _push(\`\`) _ssrRenderList(_ctx.list, (i) => { _push(\`
    \`) }) @@ -334,10 +336,12 @@ describe('ssr: components', () => { `
    ` ).code ).toMatchInlineSnapshot(` - "const { ssrRenderList: _ssrRenderList } = require(\\"vue/server-renderer\\") + "const { ssrRenderAttrs: _ssrRenderAttrs, ssrRenderList: _ssrRenderList } = require(\\"vue/server-renderer\\") return function ssrRender(_ctx, _push, _parent, _attrs) { - _push(\`<\${_ctx.someTag}>\`) + _push(\`<\${_ctx.someTag}\`) + _push(\`\${_ssrRenderAttrs(_attrs)}\`) + _push(\`>\`) _ssrRenderList(_ctx.list, (i) => { _push(\`
    \`) }) diff --git a/packages/compiler-ssr/__tests__/ssrPortal.spec.ts b/packages/compiler-ssr/__tests__/ssrTeleport.spec.ts similarity index 100% rename from packages/compiler-ssr/__tests__/ssrPortal.spec.ts rename to packages/compiler-ssr/__tests__/ssrTeleport.spec.ts diff --git a/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts b/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts index 80a26c98a49..949d8fc6b8a 100644 --- a/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts +++ b/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts @@ -1,5 +1,38 @@ -import { ComponentNode, findProp, NodeTypes } from '@vue/compiler-dom' +import { + ComponentNode, + findProp, + NodeTypes, + createCallExpression, + buildProps, + createTemplateLiteral, + DirectiveNode, + AttributeNode, + createTransformContext +} from '@vue/compiler-dom' import { processChildren, SSRTransformContext } from '../ssrCodegenTransform' +import { SSR_RENDER_ATTRS } from '../runtimeHelpers' + +function injectProp( + node: ComponentNode, + context: SSRTransformContext, + tag: AttributeNode | DirectiveNode +) { + const { props } = buildProps( + node, + createTransformContext(context.root, context.options), + node.props.filter(p => p !== tag), + true /* ssr */ + ) + if (props) { + context.pushStatement( + createCallExpression(`_push`, [ + createTemplateLiteral([ + createCallExpression(context.helper(SSR_RENDER_ATTRS), [props]) + ]) + ]) + ) + } +} export function ssrProcessTransitionGroup( node: ComponentNode, @@ -11,6 +44,7 @@ export function ssrProcessTransitionGroup( // dynamic :tag context.pushStringPart(`<`) context.pushStringPart(tag.exp!) + injectProp(node, context, tag) context.pushStringPart(`>`) processChildren( @@ -30,7 +64,9 @@ export function ssrProcessTransitionGroup( context.pushStringPart(`>`) } else { // static tag - context.pushStringPart(`<${tag.value!.content}>`) + context.pushStringPart(`<${tag.value!.content}`) + injectProp(node, context, tag) + context.pushStringPart(`>`) processChildren(node.children, context, false, true) context.pushStringPart(``) }