// TODO:
-// - lifecycle / refs
+// - refs
// - slots
// - keep alive
// - app context
shouldUpdateComponent,
createComponentInstance
} from './component'
-import {
- queueJob,
- queuePostFlushCb,
- flushPostFlushCbs,
- queueReversePostFlushCb
-} from './scheduler'
+import { queueJob, queuePostFlushCb, flushPostFlushCbs } from './scheduler'
function isSameType(n1: VNode, n2: VNode): boolean {
return n1.type === n2.type && n1.key === n2.key
}
+function invokeHooks(hooks: Function[]) {
+ for (let i = 0; i < hooks.length; i++) {
+ hooks[i]()
+ }
+}
+
export type HostNode = any
export interface RendererOptions {
// initial mount
instance.vnode = vnode
const subTree = (instance.subTree = renderComponentRoot(instance))
+ if (instance.bm !== null) {
+ invokeHooks(instance.bm)
+ }
patch(null, subTree, container, anchor)
vnode.el = subTree.el
// mounted hook
}
// upated hook
if (instance.u !== null) {
- // updated hooks are queued top-down, but should be fired bottom up
- queueReversePostFlushCb(instance.u)
+ queuePostFlushCb(instance.u)
}
}
},
const queue: Function[] = []
const postFlushCbs: Function[] = []
-const reversePostFlushCbs: Function[] = []
const p = Promise.resolve()
let isFlushing = false
}
export function queuePostFlushCb(cb: Function | Function[]) {
- queuePostCb(cb, postFlushCbs)
-}
-
-export function queueReversePostFlushCb(cb: Function | Function[]) {
- queuePostCb(cb, reversePostFlushCbs)
-}
-
-function queuePostCb(cb: Function | Function[], queue: Function[]) {
if (Array.isArray(cb)) {
- queue.push.apply(postFlushCbs, cb)
+ postFlushCbs.push.apply(postFlushCbs, cb)
} else {
- queue.push(cb)
+ postFlushCbs.push(cb)
}
}
const dedupe = (cbs: Function[]): Function[] => Array.from(new Set(cbs))
export function flushPostFlushCbs() {
- if (reversePostFlushCbs.length) {
- const cbs = dedupe(reversePostFlushCbs)
- reversePostFlushCbs.length = 0
- let i = cbs.length
- while (i--) {
- cbs[i]()
- }
- }
if (postFlushCbs.length) {
const cbs = dedupe(postFlushCbs)
postFlushCbs.length = 0