fix(compiler-ssr): fix attr fallthrough for transition/keep-alive as template root
fix #3981
This commit is contained in:
parent
9b607fe409
commit
9f6f8b35c1
@ -269,9 +269,10 @@ describe('ssr: components', () => {
|
|||||||
test('built-in fallthroughs', () => {
|
test('built-in fallthroughs', () => {
|
||||||
expect(compile(`<transition><div/></transition>`).code)
|
expect(compile(`<transition><div/></transition>`).code)
|
||||||
.toMatchInlineSnapshot(`
|
.toMatchInlineSnapshot(`
|
||||||
"
|
"const { ssrRenderAttrs: _ssrRenderAttrs } = require(\\"@vue/server-renderer\\")
|
||||||
|
|
||||||
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
||||||
_push(\`<div></div>\`)
|
_push(\`<div\${_ssrRenderAttrs(_attrs)}></div>\`)
|
||||||
}"
|
}"
|
||||||
`)
|
`)
|
||||||
|
|
||||||
@ -283,7 +284,7 @@ describe('ssr: components', () => {
|
|||||||
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
||||||
const _component_foo = _resolveComponent(\\"foo\\")
|
const _component_foo = _resolveComponent(\\"foo\\")
|
||||||
|
|
||||||
_push(_ssrRenderComponent(_component_foo, null, null, _parent))
|
_push(_ssrRenderComponent(_component_foo, _attrs, null, _parent))
|
||||||
}"
|
}"
|
||||||
`)
|
`)
|
||||||
})
|
})
|
||||||
|
@ -7,7 +7,8 @@ import {
|
|||||||
RootNode,
|
RootNode,
|
||||||
TemplateChildNode,
|
TemplateChildNode,
|
||||||
ParentNode,
|
ParentNode,
|
||||||
findDir
|
findDir,
|
||||||
|
isBuiltInType
|
||||||
} from '@vue/compiler-dom'
|
} from '@vue/compiler-dom'
|
||||||
|
|
||||||
const hasSingleChild = (node: ParentNode): boolean =>
|
const hasSingleChild = (node: ParentNode): boolean =>
|
||||||
@ -21,6 +22,18 @@ export const ssrInjectFallthroughAttrs: NodeTransform = (node, context) => {
|
|||||||
context.identifiers._attrs = 1
|
context.identifiers._attrs = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
node.type === NodeTypes.ELEMENT &&
|
||||||
|
node.tagType === ElementTypes.COMPONENT &&
|
||||||
|
(isBuiltInType(node.tag, 'Transition') ||
|
||||||
|
isBuiltInType(node.tag, 'KeepAlive'))
|
||||||
|
) {
|
||||||
|
if (hasSingleChild(node)) {
|
||||||
|
injectFallthroughAttrs(node.children[0])
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const parent = context.parent
|
const parent = context.parent
|
||||||
if (!parent || parent.type !== NodeTypes.ROOT) {
|
if (!parent || parent.type !== NodeTypes.ROOT) {
|
||||||
return
|
return
|
||||||
|
@ -180,7 +180,8 @@ export function ssrProcessComponent(
|
|||||||
} else if (component === TRANSITION_GROUP) {
|
} else if (component === TRANSITION_GROUP) {
|
||||||
return ssrProcessTransitionGroup(node, context)
|
return ssrProcessTransitionGroup(node, context)
|
||||||
} else {
|
} else {
|
||||||
// real fall-through (e.g. KeepAlive): just render its children.
|
// real fall-through: Transition / KeepAlive
|
||||||
|
// just render its children.
|
||||||
processChildren(node.children, context)
|
processChildren(node.children, context)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user