openBlock,
createBlock,
FunctionalComponent,
- createCommentVNode
+ createCommentVNode,
+ Fragment
} from '@vue/runtime-dom'
import { mockWarn } from '@vue/shared'
}
const Child = {
- setup(props: any) {
- return () => [
- createCommentVNode('hello'),
- h('button'),
- createCommentVNode('world')
- ]
+ setup() {
+ return () => (
+ openBlock(),
+ createBlock(Fragment, null, [
+ createCommentVNode('hello'),
+ h('button'),
+ createCommentVNode('world')
+ ])
+ )
}
}
return result
}
+/**
+ * dev only
+ */
const getChildRoot = (
vnode: VNode
): [VNode, ((root: VNode) => void) | undefined] => {
}
const childRoot = children[0]
const index = rawChildren.indexOf(childRoot)
- const dynamicIndex = dynamicChildren
- ? dynamicChildren.indexOf(childRoot)
- : null
+ const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1
const setRoot = (updatedRoot: VNode) => {
rawChildren[index] = updatedRoot
- if (dynamicIndex !== null) dynamicChildren[dynamicIndex] = updatedRoot
+ if (dynamicIndex > -1) {
+ dynamicChildren[dynamicIndex] = updatedRoot
+ } else if (dynamicChildren && updatedRoot.patchFlag > 0) {
+ dynamicChildren.push(updatedRoot)
+ }
}
return [normalizeVNode(childRoot), setRoot]
}
vnode: VNode<T, U>,
extraProps?: Data & VNodeProps | null
): VNode<T, U> {
- const props = extraProps
- ? vnode.props
- ? mergeProps(vnode.props, extraProps)
- : extend({}, extraProps)
- : vnode.props
// This is intentionally NOT using spread or extend to avoid the runtime
// key enumeration cost.
+ const { props, patchFlag } = vnode
+ const mergedProps = extraProps
+ ? props
+ ? mergeProps(props, extraProps)
+ : extend({}, extraProps)
+ : props
return {
__v_isVNode: true,
__v_skip: true,
type: vnode.type,
- props,
- key: props && normalizeKey(props),
+ props: mergedProps,
+ key: mergedProps && normalizeKey(mergedProps),
ref: extraProps && extraProps.ref ? normalizeRef(extraProps) : vnode.ref,
scopeId: vnode.scopeId,
children: vnode.children,
shapeFlag: vnode.shapeFlag,
// if the vnode is cloned with extra props, we can no longer assume its
// existing patch flag to be reliable and need to add the FULL_PROPS flag.
+ // note: perserve flag for fragments since they use the flag for children
+ // fast paths only.
patchFlag:
extraProps && vnode.type !== Fragment
- ? vnode.patchFlag | PatchFlags.FULL_PROPS
- : vnode.patchFlag,
+ ? patchFlag === -1 // hoisted node
+ ? PatchFlags.FULL_PROPS
+ : patchFlag | PatchFlags.FULL_PROPS
+ : patchFlag,
dynamicProps: vnode.dynamicProps,
dynamicChildren: vnode.dynamicChildren,
appContext: vnode.appContext,