From 76a119693501525ff2e59e669daaab839c3e7b01 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 24 Sep 2019 14:37:14 -0400 Subject: [PATCH] feat(runtime): support rendering comment nodes --- .../runtime-core/src/componentRenderUtils.ts | 4 ++-- packages/runtime-core/src/createRenderer.ts | 21 ++++++++++++------- packages/runtime-core/src/index.ts | 2 +- packages/runtime-core/src/vnode.ts | 6 +++--- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/packages/runtime-core/src/componentRenderUtils.ts b/packages/runtime-core/src/componentRenderUtils.ts index 0534183cd..0a617effc 100644 --- a/packages/runtime-core/src/componentRenderUtils.ts +++ b/packages/runtime-core/src/componentRenderUtils.ts @@ -3,7 +3,7 @@ import { FunctionalComponent, Data } from './component' -import { VNode, normalizeVNode, createVNode, Empty } from './vnode' +import { VNode, normalizeVNode, createVNode, Comment } from './vnode' import { ShapeFlags } from './shapeFlags' import { handleError, ErrorCodes } from './errorHandling' import { PatchFlags } from './patchFlags' @@ -45,7 +45,7 @@ export function renderComponentRoot( } } catch (err) { handleError(err, instance, ErrorCodes.RENDER_FUNCTION) - result = createVNode(Empty) + result = createVNode(Comment) } currentRenderingInstance = null return result diff --git a/packages/runtime-core/src/createRenderer.ts b/packages/runtime-core/src/createRenderer.ts index f294f941a..90fb8524c 100644 --- a/packages/runtime-core/src/createRenderer.ts +++ b/packages/runtime-core/src/createRenderer.ts @@ -1,7 +1,7 @@ import { Text, Fragment, - Empty, + Comment, Portal, normalizeVNode, VNode, @@ -191,8 +191,8 @@ export function createRenderer< case Text: processText(n1, n2, container, anchor) break - case Empty: - processEmptyNode(n1, n2, container, anchor) + case Comment: + processCommentNode(n1, n2, container, anchor) break case Fragment: processFragment( @@ -283,15 +283,20 @@ export function createRenderer< } } - function processEmptyNode( + function processCommentNode( n1: HostVNode | null, n2: HostVNode, container: HostElement, anchor: HostNode | null ) { if (n1 == null) { - hostInsert((n2.el = hostCreateComment('')), container, anchor) + hostInsert( + (n2.el = hostCreateComment((n2.children as string) || '')), + container, + anchor + ) } else { + // there's no support for dynamic comments n2.el = n1.el } } @@ -677,7 +682,7 @@ export function createRenderer< } } // insert an empty node as the placeholder for the portal - processEmptyNode(n1, n2, container, anchor) + processCommentNode(n1, n2, container, anchor) } function processSuspense( @@ -1057,8 +1062,8 @@ export function createRenderer< }) // give it a placeholder - const placeholder = (instance.subTree = createVNode(Empty)) - processEmptyNode(null, placeholder, container, anchor) + const placeholder = (instance.subTree = createVNode(Comment)) + processCommentNode(null, placeholder, container, anchor) initialVNode.el = placeholder.el return } diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index 4d42f3acf..fe9b519cf 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -19,7 +19,7 @@ export { createBlock } from './vnode' // VNode type symbols -export { Text, Empty, Fragment, Portal, Suspense } from './vnode' +export { Text, Comment, Fragment, Portal, Suspense } from './vnode' // VNode flags export { PublicPatchFlags as PatchFlags } from './patchFlags' export { PublicShapeFlags as ShapeFlags } from './shapeFlags' diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index 589042ec3..ca3670c3d 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -16,7 +16,7 @@ import { SuspenseBoundary } from './suspense' export const Fragment = __DEV__ ? Symbol('Fragment') : Symbol() export const Text = __DEV__ ? Symbol('Text') : Symbol() -export const Empty = __DEV__ ? Symbol('Empty') : Symbol() +export const Comment = __DEV__ ? Symbol('Empty') : Symbol() export const Portal = __DEV__ ? Symbol('Portal') : Symbol() export const Suspense = __DEV__ ? Symbol('Suspense') : Symbol() @@ -27,7 +27,7 @@ export type VNodeTypes = | typeof Fragment | typeof Portal | typeof Text - | typeof Empty + | typeof Comment | typeof Suspense type VNodeChildAtom = @@ -245,7 +245,7 @@ export function cloneVNode(vnode: VNode): VNode { export function normalizeVNode(child: VNodeChild): VNode { if (child == null) { // empty placeholder - return createVNode(Empty) + return createVNode(Comment) } else if (isArray(child)) { // fragment return createVNode(Fragment, null, child)