fix(compiler-core): template v-if should never be treated as dev root fragment

close #5189
This commit is contained in:
Evan You 2022-05-11 17:43:17 +08:00
parent b7025d24f1
commit 51f3d386de
4 changed files with 10 additions and 9 deletions

View File

@ -16,7 +16,7 @@ return function render(_ctx, _cache) {
? (_openBlock(), _createElementBlock(\\"div\\", { key: 0 }, \\"yes\\")) ? (_openBlock(), _createElementBlock(\\"div\\", { key: 0 }, \\"yes\\"))
: (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [ : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [
_createTextVNode(\\"no\\") _createTextVNode(\\"no\\")
], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */)), ], 64 /* STABLE_FRAGMENT */)),
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(list, (value, index) => { (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(list, (value, index) => {
return (_openBlock(), _createElementBlock(\\"div\\", null, [ return (_openBlock(), _createElementBlock(\\"div\\", null, [
_createElementVNode(\\"span\\", null, _toDisplayString(value + index), 1 /* TEXT */) _createElementVNode(\\"span\\", null, _toDisplayString(value + index), 1 /* TEXT */)
@ -40,7 +40,7 @@ return function render(_ctx, _cache) {
? (_openBlock(), _createElementBlock(\\"div\\", { key: 0 }, \\"yes\\")) ? (_openBlock(), _createElementBlock(\\"div\\", { key: 0 }, \\"yes\\"))
: (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [ : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [
_createTextVNode(\\"no\\") _createTextVNode(\\"no\\")
], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */)), ], 64 /* STABLE_FRAGMENT */)),
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, (value, index) => { (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, (value, index) => {
return (_openBlock(), _createElementBlock(\\"div\\", null, [ return (_openBlock(), _createElementBlock(\\"div\\", null, [
_createElementVNode(\\"span\\", null, _toDisplayString(value + index), 1 /* TEXT */) _createElementVNode(\\"span\\", null, _toDisplayString(value + index), 1 /* TEXT */)
@ -63,7 +63,7 @@ export function render(_ctx, _cache) {
? (_openBlock(), _createElementBlock(\\"div\\", { key: 0 }, \\"yes\\")) ? (_openBlock(), _createElementBlock(\\"div\\", { key: 0 }, \\"yes\\"))
: (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [ : (_openBlock(), _createElementBlock(_Fragment, { key: 1 }, [
_createTextVNode(\\"no\\") _createTextVNode(\\"no\\")
], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */)), ], 64 /* STABLE_FRAGMENT */)),
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, (value, index) => { (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, (value, index) => {
return (_openBlock(), _createElementBlock(\\"div\\", null, [ return (_openBlock(), _createElementBlock(\\"div\\", null, [
_createElementVNode(\\"span\\", null, _toDisplayString(value + index), 1 /* TEXT */) _createElementVNode(\\"span\\", null, _toDisplayString(value + index), 1 /* TEXT */)

View File

@ -111,7 +111,7 @@ return function render(_ctx, _cache) {
? (_openBlock(), _createElementBlock(\\"div\\", { key: 0 })) ? (_openBlock(), _createElementBlock(\\"div\\", { key: 0 }))
: orNot : orNot
? (_openBlock(), _createElementBlock(\\"p\\", { key: 1 })) ? (_openBlock(), _createElementBlock(\\"p\\", { key: 1 }))
: (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\\"fine\\"], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */)) : (_openBlock(), _createElementBlock(_Fragment, { key: 2 }, [\\"fine\\"], 64 /* STABLE_FRAGMENT */))
} }
}" }"
`; `;

View File

@ -259,6 +259,7 @@ export interface IfBranchNode extends Node {
condition: ExpressionNode | undefined // else condition: ExpressionNode | undefined // else
children: TemplateChildNode[] children: TemplateChildNode[]
userKey?: AttributeNode | DirectiveNode userKey?: AttributeNode | DirectiveNode
isTemplateIf?: boolean
} }
export interface ForNode extends Node { export interface ForNode extends Node {

View File

@ -209,15 +209,14 @@ export function processIf(
} }
function createIfBranch(node: ElementNode, dir: DirectiveNode): IfBranchNode { function createIfBranch(node: ElementNode, dir: DirectiveNode): IfBranchNode {
const isTemplateIf = node.tagType === ElementTypes.TEMPLATE
return { return {
type: NodeTypes.IF_BRANCH, type: NodeTypes.IF_BRANCH,
loc: node.loc, loc: node.loc,
condition: dir.name === 'else' ? undefined : dir.exp, condition: dir.name === 'else' ? undefined : dir.exp,
children: children: isTemplateIf && !findDir(node, 'for') ? node.children : [node],
node.tagType === ElementTypes.TEMPLATE && !findDir(node, 'for') userKey: findProp(node, `key`),
? node.children isTemplateIf
: [node],
userKey: findProp(node, `key`)
} }
} }
@ -274,6 +273,7 @@ function createChildrenCodegenNode(
// the rest being comments // the rest being comments
if ( if (
__DEV__ && __DEV__ &&
!branch.isTemplateIf &&
children.filter(c => c.type !== NodeTypes.COMMENT).length === 1 children.filter(c => c.type !== NodeTypes.COMMENT).length === 1
) { ) {
patchFlag |= PatchFlags.DEV_ROOT_FRAGMENT patchFlag |= PatchFlags.DEV_ROOT_FRAGMENT