-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
Copy pathuseObserver.ts
50 lines (46 loc) · 1.31 KB
/
useObserver.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { Tracker } from '@formily/reactive'
import { getCurrentInstance, onBeforeUnmount, isVue3 } from 'vue-demi'
import { IObserverOptions } from '../types'
/* istanbul ignore next */
export const useObserver = (options?: IObserverOptions) => {
if (isVue3) {
const vm = getCurrentInstance()
let tracker: Tracker = null
const disposeTracker = () => {
if (tracker) {
tracker.dispose()
tracker = null
}
}
onBeforeUnmount(disposeTracker)
Object.defineProperty(vm, 'effect', {
get() {
// https://github.com/alibaba/formily/issues/2655
return vm['_updateEffect'] || {}
},
set(newValue) {
vm['_updateEffectRun'] = newValue.run
const newTracker = () => {
disposeTracker()
tracker = new Tracker(() => {
if (options?.scheduler && typeof options.scheduler === 'function') {
options.scheduler(update)
} else {
update()
}
})
}
const update = function () {
newTracker()
let refn: any = null
tracker?.track(() => {
refn = vm['_updateEffectRun'].call(newValue)
})
return refn
}
newValue.run = update
vm['_updateEffect'] = newValue
},
})
}
}