import {
isProxy,
isReactive,
+ isReadonly,
+ isShallow,
markRaw,
reactive,
readonly,
const c = computed(() => {})
expect(isProxy(c)).toBe(false)
})
+
+ test('The results of the shallow and readonly assignments are the same (Map)', () => {
+ const map = reactive(new Map())
+ map.set('foo', shallowReactive({ a: 2 }))
+ expect(isShallow(map.get('foo'))).toBe(true)
+
+ map.set('bar', readonly({ b: 2 }))
+ expect(isReadonly(map.get('bar'))).toBe(true)
+ })
+
+ test('The results of the shallow and readonly assignments are the same (Set)', () => {
+ const set = reactive(new Set())
+ set.add(shallowReactive({ a: 2 }))
+ set.add(readonly({ b: 2 }))
+ let count = 0
+ for (const i of set) {
+ if (count === 0) expect(isShallow(i)).toBe(true)
+ else expect(isReadonly(i)).toBe(true)
+ count++
+ }
+ })
})
shallowSet.forEach(x => expect(isReactive(x)).toBe(false))
})
+ test('Setting a reactive object on a shallowReactive map', () => {
+ const msg = ref('ads')
+ const bar = reactive({ msg })
+ const foo = shallowReactive(new Map([['foo1', bar]]))
+ foo.set('foo2', bar)
+
+ expect(isReactive(foo.get('foo2'))).toBe(true)
+ expect(isReactive(foo.get('foo1'))).toBe(true)
+ })
+
+ test('Setting a reactive object on a shallowReactive set', () => {
+ const msg = ref(1)
+ const bar = reactive({ msg })
+ const foo = reactive({ msg })
+
+ const deps = shallowReactive(new Set([bar]))
+ deps.add(foo)
+
+ deps.forEach(dep => {
+ expect(isReactive(dep)).toBe(true)
+ })
+ })
+
// #1210
test('onTrack on called on objectSpread', () => {
const onTrackFn = vi.fn()
-import { toRaw, toReactive, toReadonly } from './reactive'
+import {
+ isReadonly,
+ isShallow,
+ toRaw,
+ toReactive,
+ toReadonly,
+} from './reactive'
import {
ITERATE_KEY,
MAP_KEY_ITERATE_KEY,
return Reflect.get(target, 'size', target)
}
-function add(this: SetTypes, value: unknown) {
- value = toRaw(value)
+function add(this: SetTypes, value: unknown, _isShallow = false) {
+ if (!_isShallow && !isShallow(value) && !isReadonly(value)) {
+ value = toRaw(value)
+ }
const target = toRaw(this)
const proto = getProto(target)
const hadKey = proto.has.call(target, value)
return this
}
-function set(this: MapTypes, key: unknown, value: unknown) {
- value = toRaw(value)
+function set(this: MapTypes, key: unknown, value: unknown, _isShallow = false) {
+ if (!_isShallow && !isShallow(value) && !isReadonly(value)) {
+ value = toRaw(value)
+ }
const target = toRaw(this)
const { has, get } = getProto(target)
return size(this as unknown as IterableCollections)
},
has,
- add,
- set,
+ add(this: SetTypes, value: unknown) {
+ return add.call(this, value, true)
+ },
+ set(this: MapTypes, key: unknown, value: unknown) {
+ return set.call(this, key, value, true)
+ },
delete: deleteEntry,
clear,
forEach: createForEach(false, true),