export function computed(getterOrOptions) {
let getter;
let setter;
if(isFuncction(getterOrOptions)) {
getter = getterOrOptions;
setter = () => { console.log('不能修改')}
}else {
getter= getterOrOptions.get
setter = getterOrOptions.set
}
return new ComputedRefImpl(getter, setter)
}
class ComputedRefImpl {
public _value;
public _dirty = true;
public effect;
constructor(public getter, public seetter) {
this.effect = effect(getter, {
lazy: true,
scheduler:() => {
if(!this.dirty) {
this.dirty = true
trigger(this, TriggerOpTypes.SET, 'value')
}
}
})
}
get value() {
if(this._dirty) {
this._value = this.effect();
this._dirty = false
}
track(this, TrackOpTypes.GET, 'value')
return this._value;
}
set value(newValue) {
this.setter(newValue)
}
}
const state = reactive({age: 1})
const cAge = computed(() => {
return state.age + 10
})
console.log(cAge.value)
console.log(cAge.value)
state.age = 2;
console.log(cAge.value)
effect(() => {
cAge.value
})
state.age = 3;