EMPTY_OBJ,
EMPTY_ARR,
isReservedProp,
- isFunction
+ isFunction,
+ isArray
} from '@vue/shared'
import { queueJob, queuePostFlushCb, flushPostFlushCbs } from './scheduler'
import {
}
}
+function queuePostEffect(
+ fn: Function | Function[],
+ suspense: SuspenseBoundary<any, any> | null
+) {
+ if (suspense === null) {
+ queuePostFlushCb(fn)
+ } else if (isArray(fn)) {
+ suspense.effects.push(...fn)
+ } else {
+ suspense.effects.push(fn)
+ }
+}
+
export interface RendererOptions<HostNode = any, HostElement = any> {
patchProp(
el: HostElement,
}
hostInsert(el, container, anchor)
if (props != null && props.vnodeMounted != null) {
- queuePostFlushCb(() => {
+ queuePostEffect(() => {
invokeDirectiveHook(props.vnodeMounted, parentComponent, vnode)
- })
+ }, parentSuspense)
}
}
}
if (newProps.vnodeUpdated != null) {
- queuePostFlushCb(() => {
+ queuePostEffect(() => {
invokeDirectiveHook(newProps.vnodeUpdated, parentComponent, n2, n1)
- })
+ }, parentSuspense)
}
}
))
function resolveSuspense() {
- const { subTree, fallbackTree, bufferedJobs, vnode } = suspense
+ const { subTree, fallbackTree, effects, vnode } = suspense
// unmount fallback tree
unmount(fallbackTree as HostVNode, parentComponent, suspense, true)
// move content from off-dom container to actual container
if (!parent.isResolved) {
// found a pending parent suspense, merge buffered post jobs
// into that parent
- parent.bufferedJobs.push(...bufferedJobs)
+ parent.effects.push(...effects)
hasUnresolvedAncestor = true
break
}
}
// no pending parent suspense, flush all jobs
if (!hasUnresolvedAncestor) {
- queuePostFlushCb(bufferedJobs)
+ queuePostFlushCb(effects)
}
suspense.isResolved = true
// invoke @resolve event
initialVNode.el = subTree.el
// mounted hook
if (instance.m !== null) {
- queuePostFlushCb(instance.m)
+ queuePostEffect(instance.m, parentSuspense)
}
mounted = true
} else {
}
// upated hook
if (instance.u !== null) {
- queuePostFlushCb(instance.u)
+ queuePostEffect(instance.u, parentSuspense)
}
if (__DEV__) {
}
if (props != null && props.vnodeUnmounted != null) {
- queuePostFlushCb(() => {
+ queuePostEffect(() => {
invokeDirectiveHook(props.vnodeUnmounted, parentComponent, vnode)
- })
+ }, parentSuspense)
}
}
unmount(subTree, instance, parentSuspense, doRemove)
// unmounted hook
if (um !== null) {
- queuePostFlushCb(um)
+ queuePostEffect(um, parentSuspense)
}
}