-import { toRaw, reactive, readonly, ReactiveFlags } from './reactive'
+import { toRaw, ReactiveFlags, toReactive, toReadonly } from './reactive'
import { track, trigger, ITERATE_KEY, MAP_KEY_ITERATE_KEY } from './effect'
import { TrackOpTypes, TriggerOpTypes } from './operations'
-import {
- isObject,
- capitalize,
- hasOwn,
- hasChanged,
- toRawType,
- isMap
-} from '@vue/shared'
+import { capitalize, hasOwn, hasChanged, toRawType, isMap } from '@vue/shared'
export type CollectionTypes = IterableCollections | WeakCollections
type MapTypes = Map<any, any> | WeakMap<any, any>
type SetTypes = Set<any> | WeakSet<any>
-const toReactive = <T extends unknown>(value: T): T =>
- isObject(value) ? reactive(value) : value
-
-const toReadonly = <T extends unknown>(value: T): T =>
- isObject(value) ? readonly(value as Record<any, any>) : value
-
const toShallow = <T extends unknown>(value: T): T => value
const getProto = <T extends CollectionTypes>(v: T): any =>
import { isTracking, trackEffects, triggerEffects } from './effect'
import { TrackOpTypes, TriggerOpTypes } from './operations'
-import { isArray, isObject, hasChanged } from '@vue/shared'
-import { reactive, isProxy, toRaw, isReactive } from './reactive'
+import { isArray, hasChanged } from '@vue/shared'
+import { isProxy, toRaw, isReactive, toReactive } from './reactive'
import { CollectionTypes } from './collectionHandlers'
import { createDep, Dep } from './dep'
}
}
-const convert = <T extends unknown>(val: T): T =>
- isObject(val) ? reactive(val) : val
-
export function isRef<T>(r: Ref<T> | unknown): r is Ref<T>
export function isRef(r: any): r is Ref {
return Boolean(r && r.__v_isRef === true)
return createRef(value, true)
}
+function createRef(rawValue: unknown, shallow: boolean) {
+ if (isRef(rawValue)) {
+ return rawValue
+ }
+ return new RefImpl(rawValue, shallow)
+}
+
class RefImpl<T> {
private _value: T
private _rawValue: T
constructor(value: T, public readonly _shallow: boolean) {
this._rawValue = _shallow ? value : toRaw(value)
- this._value = _shallow ? value : convert(value)
+ this._value = _shallow ? value : toReactive(value)
}
get value() {
newVal = this._shallow ? newVal : toRaw(newVal)
if (hasChanged(newVal, this._rawValue)) {
this._rawValue = newVal
- this._value = this._shallow ? newVal : convert(newVal)
+ this._value = this._shallow ? newVal : toReactive(newVal)
triggerRefValue(this, newVal)
}
}
}
-function createRef(rawValue: unknown, shallow: boolean) {
- if (isRef(rawValue)) {
- return rawValue
- }
- return new RefImpl(rawValue, shallow)
-}
-
export function triggerRef(ref: Ref) {
triggerRefValue(ref, __DEV__ ? ref.value : void 0)
}