|
|
@@ -1,14 +1,46 @@
|
|
|
import { ReactiveEffect } from '@vue/reactivity'
|
|
|
-import { type SchedulerJob, currentInstance, queueJob } from '@vue/runtime-dom'
|
|
|
+import {
|
|
|
+ type SchedulerJob,
|
|
|
+ currentInstance,
|
|
|
+ queueJob,
|
|
|
+ queuePostFlushCb,
|
|
|
+ setCurrentInstance,
|
|
|
+ warn,
|
|
|
+} from '@vue/runtime-dom'
|
|
|
+import { type VaporComponentInstance, isVaporComponent } from './component'
|
|
|
+import { invokeArrayFns } from '@vue/shared'
|
|
|
|
|
|
-export function renderEffect(fn: () => void): void {
|
|
|
- const updateFn = () => {
|
|
|
- fn()
|
|
|
+export function renderEffect(fn: () => void, noLifecycle = false): void {
|
|
|
+ const instance = currentInstance as VaporComponentInstance
|
|
|
+ if (__DEV__ && !isVaporComponent(instance)) {
|
|
|
+ warn('renderEffect called without active vapor instance.')
|
|
|
}
|
|
|
- const effect = new ReactiveEffect(updateFn)
|
|
|
+
|
|
|
+ const effect = new ReactiveEffect(
|
|
|
+ noLifecycle
|
|
|
+ ? fn
|
|
|
+ : () => {
|
|
|
+ const reset = setCurrentInstance(instance)
|
|
|
+ const { isMounted, isUpdating, bu, u } = instance
|
|
|
+ // before update
|
|
|
+ if (isMounted && !isUpdating && (bu || u)) {
|
|
|
+ instance.isUpdating = true
|
|
|
+ bu && invokeArrayFns(bu)
|
|
|
+ fn()
|
|
|
+ queuePostFlushCb(() => {
|
|
|
+ instance.isUpdating = false
|
|
|
+ u && invokeArrayFns(u)
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ fn()
|
|
|
+ }
|
|
|
+ reset()
|
|
|
+ },
|
|
|
+ )
|
|
|
+
|
|
|
const job: SchedulerJob = effect.runIfDirty.bind(effect)
|
|
|
- job.i = currentInstance as any
|
|
|
- job.id = currentInstance!.uid
|
|
|
+ job.i = instance
|
|
|
+ job.id = instance.uid
|
|
|
effect.scheduler = () => queueJob(job)
|
|
|
effect.run()
|
|
|
|