wft-utils
Version:
The commonly used tool functions in daily development
59 lines (54 loc) • 1.08 kB
JavaScript
class Dep {
constructor() {
this.subscribers = new Set()
}
depend () {
if (activeEffect) {
this.subscribers.add(activeEffect)
}
}
notify () {
this.subscribers.forEach(effect => {
effect()
})
}
}
let activeEffect = null
function watchEffect (effect) {
activeEffect = effect
effect()
activeEffect = null
}
const targetMap = new WeakMap()
function getDep (target, key) {
let depsMap = targetMap.get(target)
if (!depsMap) {
depsMap = new Map()
targetMap.set(target, depsMap)
}
let dep = depsMap.get(key)
if (!dep) {
dep = new Dep()
depsMap.set(key, dep)
}
return dep
}
function reactive (raw) {
Object.keys(raw).forEach(key => {
const dep = getDep(raw, key)
let value = raw[key]
Object.defineProperty(raw, key, {
get () {
dep.depend()
return value
},
set (newValue) {
if (newValue !== value) {
value = newValue
dep.notify()
}
}
})
})
return raw
}