import { createDep, Dep } from './dep' import { toReactive } from './reactive' import { activeEffect, track, trackEffects } from './effect' export interface Ref { value: T } export function ref(value?: unknown) { return createRef(value, false) } function createRef(rawValue: unknown, shallow: boolean) { if (isRef(rawValue)) { return rawValue } return new RefImpl(rawValue, shallow) } class RefImpl { private _value: T public dep?: Dep = undefined public readonly __v_isRef = true constructor( value: T, public readonly __v_isShallow: boolean ) { this._value = __v_isShallow ? value : toReactive(value) } get value() { trackRefValue(this) return this._value } set value(newValue) {} } export function trackRefValue(ref) { if (activeEffect) { trackEffects(ref.dep || (ref.dep = createDep())) } } //是否为ref export function isRef(r: any): r is Ref { return !!(r && r.__v_isRef === true) }