| 123456789101112131415161718192021222324252627282930313233343536 |
- import { invokeArrayFns } from '@vue/shared'
- import type { VaporLifecycleHooks } from './apiLifecycle'
- import { type ComponentInternalInstance, setCurrentInstance } from './component'
- import { queuePostFlushCb } from './scheduler'
- import { type DirectiveHookName, invokeDirectiveHook } from './directives'
- export function invokeLifecycle(
- instance: ComponentInternalInstance,
- lifecycle: VaporLifecycleHooks,
- directive: DirectiveHookName,
- cb?: (instance: ComponentInternalInstance) => void,
- post?: boolean,
- ) {
- invokeArrayFns(post ? [invokeSub, invokeCurrent] : [invokeCurrent, invokeSub])
- function invokeCurrent() {
- cb && cb(instance)
- const hooks = instance[lifecycle]
- if (hooks) {
- const fn = () => {
- const reset = setCurrentInstance(instance)
- instance.scope.run(() => invokeArrayFns(hooks))
- reset()
- }
- post ? queuePostFlushCb(fn) : fn()
- }
- invokeDirectiveHook(instance, directive, instance.scope)
- }
- function invokeSub() {
- instance.comps.forEach(comp =>
- invokeLifecycle(comp, lifecycle, directive, cb, post),
- )
- }
- }
|