From 28a0c50357a49937a2e35c4b56c615e80cf77066 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 28 May 2019 10:28:25 +0800 Subject: [PATCH] refactor: use util methods --- packages/runtime-core/src/component.ts | 1 + packages/runtime-core/src/createRenderer.ts | 30 +++++++++++++------- packages/runtime-core/src/index.ts | 2 +- packages/runtime-core/src/{h.ts => vnode.ts} | 4 ++- tsconfig.json | 3 +- 5 files changed, 25 insertions(+), 15 deletions(-) create mode 100644 packages/runtime-core/src/component.ts rename packages/runtime-core/src/{h.ts => vnode.ts} (95%) diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts new file mode 100644 index 00000000..9f672302 --- /dev/null +++ b/packages/runtime-core/src/component.ts @@ -0,0 +1 @@ +export class Component {} diff --git a/packages/runtime-core/src/createRenderer.ts b/packages/runtime-core/src/createRenderer.ts index daced6e7..2ce239e3 100644 --- a/packages/runtime-core/src/createRenderer.ts +++ b/packages/runtime-core/src/createRenderer.ts @@ -16,8 +16,9 @@ import { createVNode, VNode, VNodeChildren -} from './h.js' +} from './vnode.js' import { TEXT, CLASS, STYLE, PROPS, KEYED, UNKEYED } from './patchFlags' +import { isString, isFunction, isArray } from '@vue/shared' const emptyArr: any[] = [] const emptyObj: { [key: string]: any } = {} @@ -82,8 +83,8 @@ export function createRenderer(options: RendererOptions) { processEmptyNode(n1, n2, container, anchor) } else if (type === Fragment) { processFragment(n1, n2, container, anchor, optimized) - } else if (typeof type === 'function') { - // TODO Component + } else if (isFunction(type)) { + processComponent(n1, n2, container, anchor) } else { processElement(n1, n2, container, anchor, optimized) } @@ -144,7 +145,7 @@ export function createRenderer(options: RendererOptions) { hostPatchProp(el, key, vnode.props[key], null, false) } } - if (typeof vnode.children === 'string') { + if (isString(vnode.children)) { hostSetElementText(el, vnode.children) } else if (vnode.children != null) { mountChildren(vnode.children, el) @@ -168,7 +169,7 @@ export function createRenderer(options: RendererOptions) { if (child == null) { // empty placeholder return createVNode(Empty) - } else if (Array.isArray(child)) { + } else if (isArray(child)) { // fragment return createVNode(Fragment, null, child) } else if (typeof child === 'object') { @@ -322,6 +323,13 @@ export function createRenderer(options: RendererOptions) { } } + function processComponent( + n1: VNode | null, + n2: VNode, + container: HostNode, + anchor?: HostNode + ) {} + function patchChildren( n1: VNode | null, n2: VNode, @@ -359,20 +367,20 @@ export function createRenderer(options: RendererOptions) { } } - if (typeof c2 === 'string') { + if (isString(c2)) { // text children fast path - if (Array.isArray(c1)) { + if (isArray(c1)) { unmountChildren(c1 as VNode[]) } hostSetElementText(container, c2) } else { - if (typeof c1 === 'string') { + if (isString(c1)) { hostSetElementText(container, '') if (c2 != null) { mountChildren(c2, container, anchor) } - } else if (Array.isArray(c1)) { - if (Array.isArray(c2)) { + } else if (isArray(c1)) { + if (isArray(c2)) { // two arrays, cannot assume anything, do full diff patchKeyedChildren(c1 as VNode[], c2, container, anchor, optimized) } else { @@ -596,7 +604,7 @@ export function createRenderer(options: RendererOptions) { const shouldRemoveChildren = vnode.type === Fragment && doRemove if (vnode.dynamicChildren != null) { unmountChildren(vnode.dynamicChildren, shouldRemoveChildren) - } else if (Array.isArray(vnode.children)) { + } else if (isArray(vnode.children)) { unmountChildren(vnode.children as VNode[], shouldRemoveChildren) } if (doRemove) { diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index 67477283..09bbadef 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -6,7 +6,7 @@ export { Fragment, Text, Empty -} from './h' +} from './vnode' export { createRenderer, RendererOptions } from './createRenderer' export * from '@vue/observer' export { TEXT, CLASS, STYLE, PROPS, KEYED, UNKEYED } from './patchFlags' diff --git a/packages/runtime-core/src/h.ts b/packages/runtime-core/src/vnode.ts similarity index 95% rename from packages/runtime-core/src/h.ts rename to packages/runtime-core/src/vnode.ts index ef84138e..4bac668a 100644 --- a/packages/runtime-core/src/h.ts +++ b/packages/runtime-core/src/vnode.ts @@ -1,3 +1,5 @@ +import { isFunction } from '@vue/shared' + export const Fragment = Symbol('Fragment') export const Text = Symbol('Text') export const Empty = Symbol('Empty') @@ -72,7 +74,7 @@ export function createVNode( dynamicProps, dynamicChildren: null } - if (patchFlag != null && shouldTrack) { + if (shouldTrack && (patchFlag != null || isFunction(type))) { trackDynamicNode(vnode) } return vnode diff --git a/tsconfig.json b/tsconfig.json index ccb98834..69423b40 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,8 +26,7 @@ "@vue/observer": ["packages/observer/src"], "@vue/scheduler": ["packages/scheduler/src"], "@vue/compiler-core": ["packages/compiler-core/src"], - "@vue/server-renderer": ["packages/server-renderer/src"], - "@vue/decorators": ["packages/decorators/src"] + "@vue/server-renderer": ["packages/server-renderer/src"] } }, "include": [