فهرست منبع

refactor: use util methods

Evan You 7 سال پیش
والد
کامیت
28a0c50357

+ 1 - 0
packages/runtime-core/src/component.ts

@@ -0,0 +1 @@
+export class Component {}

+ 19 - 11
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) {

+ 1 - 1
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'

+ 3 - 1
packages/runtime-core/src/h.ts → 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

+ 1 - 2
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": [