Explorar o código

fix(reactivity): avoid unwrapping `.value` when the proxy is a direct wrapper of Ref (#13569)

Johnson Chu hai 9 meses
pai
achega
19ae372739

+ 1 - 1
packages/reactivity/__tests__/readonly.spec.ts

@@ -523,7 +523,7 @@ describe('reactivity/readonly', () => {
   })
 })
 
-test.todo('should be able to trigger with triggerRef', () => {
+test('should be able to trigger with triggerRef', () => {
   const r = shallowRef({ a: 1 })
   const ror = readonly(r)
   let dummy

+ 6 - 1
packages/reactivity/src/baseHandlers.ts

@@ -96,15 +96,20 @@ class BaseReactiveHandler implements ProxyHandler<Target> {
       }
     }
 
+    const wasRef = isRef(target)
     const res = Reflect.get(
       target,
       key,
       // if this is a proxy wrapping a ref, return methods using the raw ref
       // as receiver so that we don't have to call `toRaw` on the ref in all
       // its class methods
-      isRef(target) ? target : receiver,
+      wasRef ? target : receiver,
     )
 
+    if (wasRef && key !== 'value') {
+      return res
+    }
+
     if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
       return res
     }

+ 0 - 6
packages/reactivity/src/dep.ts

@@ -15,12 +15,6 @@ class Dep implements Dependency {
   _subs: Link | undefined = undefined
   subsTail: Link | undefined = undefined
 
-  /**
-   * @internal
-   */
-  readonly __v_skip = true
-  // TODO isolatedDeclarations ReactiveFlags.SKIP
-
   constructor(
     private map: KeyToDepMap,
     private key: unknown,