componentLifecycle.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import { invokeArrayFns } from '@vue/shared'
  2. import type { VaporLifecycleHooks } from './apiLifecycle'
  3. import { type ComponentInternalInstance, setCurrentInstance } from './component'
  4. import { queuePostFlushCb } from './scheduler'
  5. import { type DirectiveHookName, invokeDirectiveHook } from './directives'
  6. export function invokeLifecycle(
  7. instance: ComponentInternalInstance,
  8. lifecycle: VaporLifecycleHooks,
  9. directive: DirectiveHookName,
  10. cb?: (instance: ComponentInternalInstance) => void,
  11. post?: boolean,
  12. ) {
  13. invokeArrayFns(post ? [invokeSub, invokeCurrent] : [invokeCurrent, invokeSub])
  14. function invokeCurrent() {
  15. cb && cb(instance)
  16. const hooks = instance[lifecycle]
  17. if (hooks) {
  18. const fn = () => {
  19. const reset = setCurrentInstance(instance)
  20. instance.scope.run(() => invokeArrayFns(hooks))
  21. reset()
  22. }
  23. post ? queuePostFlushCb(fn) : fn()
  24. }
  25. invokeDirectiveHook(instance, directive, instance.scope)
  26. }
  27. function invokeSub() {
  28. instance.comps.forEach(comp =>
  29. invokeLifecycle(comp, lifecycle, directive, cb, post),
  30. )
  31. }
  32. }