Преглед изворни кода

fix(reactivity): ensure markRaw objects are not reactive (#12824)

close #12807
FatRadish пре 1 година
родитељ
комит
295b5ec19b
2 измењених фајлова са 12 додато и 5 уклоњено
  1. 7 0
      packages/reactivity/__tests__/reactive.spec.ts
  2. 5 5
      packages/reactivity/src/reactive.ts

+ 7 - 0
packages/reactivity/__tests__/reactive.spec.ts

@@ -301,6 +301,13 @@ describe('reactivity/reactive', () => {
     expect(() => markRaw(obj)).not.toThrowError()
     expect(() => markRaw(obj)).not.toThrowError()
   })
   })
 
 
+  test('should not markRaw object as reactive', () => {
+    const a = reactive({ a: 1 })
+    const b = reactive({ b: 2 }) as any
+    b.a = markRaw(toRaw(a))
+    expect(b.a === a).toBe(false)
+  })
+
   test('should not observe non-extensible objects', () => {
   test('should not observe non-extensible objects', () => {
     const obj = reactive({
     const obj = reactive({
       foo: Object.preventExtensions({ a: 1 }),
       foo: Object.preventExtensions({ a: 1 }),

+ 5 - 5
packages/reactivity/src/reactive.ts

@@ -279,16 +279,16 @@ function createReactiveObject(
   ) {
   ) {
     return target
     return target
   }
   }
-  // target already has corresponding Proxy
-  const existingProxy = proxyMap.get(target)
-  if (existingProxy) {
-    return existingProxy
-  }
   // only specific value types can be observed.
   // only specific value types can be observed.
   const targetType = getTargetType(target)
   const targetType = getTargetType(target)
   if (targetType === TargetType.INVALID) {
   if (targetType === TargetType.INVALID) {
     return target
     return target
   }
   }
+  // target already has corresponding Proxy
+  const existingProxy = proxyMap.get(target)
+  if (existingProxy) {
+    return existingProxy
+  }
   const proxy = new Proxy(
   const proxy = new Proxy(
     target,
     target,
     targetType === TargetType.COLLECTION ? collectionHandlers : baseHandlers,
     targetType === TargetType.COLLECTION ? collectionHandlers : baseHandlers,