refactor: use util methods

This commit is contained in:
Evan You 2019-05-28 10:28:25 +08:00
parent a4d116e3f7
commit 28a0c50357
5 changed files with 25 additions and 15 deletions

View File

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

View File

@ -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) {

View File

@ -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'

View File

@ -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

View File

@ -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": [