From e5ba1cec20ead26294a78c68c3423960a765736e Mon Sep 17 00:00:00 2001 From: luwuer Date: Thu, 19 Nov 2020 19:34:25 +0800 Subject: [PATCH] fix(runtime-core): inherit attrs inconsistent between dev and prod (#2549) --- .../runtime-core/src/componentRenderUtils.ts | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/src/componentRenderUtils.ts b/packages/runtime-core/src/componentRenderUtils.ts index bd8521415ff..af5d15de1a4 100644 --- a/packages/runtime-core/src/componentRenderUtils.ts +++ b/packages/runtime-core/src/componentRenderUtils.ts @@ -14,7 +14,13 @@ import { isVNode } from './vnode' import { handleError, ErrorCodes } from './errorHandling' -import { PatchFlags, ShapeFlags, isOn, isModelListener } from '@vue/shared' +import { + PatchFlags, + ShapeFlags, + isOn, + isModelListener, + isArray +} from '@vue/shared' import { warn } from './warning' import { isHmrUpdating } from './hmr' import { NormalizedProps } from './componentProps' @@ -117,7 +123,7 @@ export function renderComponentRoot( // to have comments along side the root element which makes it a fragment let root = result let setRoot: ((root: VNode) => void) | undefined = undefined - if (__DEV__) { + if (__DEV__ && isRootCommentEffectChild(root)) { ;[root, setRoot] = getChildRoot(result) } @@ -247,6 +253,20 @@ const getChildRoot = ( return [normalizeVNode(childRoot), setRoot] } +const isRootCommentEffectChild = (vnode: VNode): boolean => { + const { children } = vnode + if (isArray(children)) { + let isFragmentChild = false + const comments = children.filter(child => { + if ((child as VNode).type === Fragment) isFragmentChild = true + return (child as VNode).type === Comment + }) + return !isFragmentChild && comments.length === children.length - 1 + } + + return false +} + /** * dev only */