Parcourir la source

fix(ref): should not trigger when setting value to same proxy (#3658)

Yang Mingshan il y a 4 ans
Parent
commit
08f504c1b7
2 fichiers modifiés avec 27 ajouts et 3 suppressions
  1. 20 0
      packages/reactivity/__tests__/ref.spec.ts
  2. 7 3
      packages/reactivity/src/ref.ts

+ 20 - 0
packages/reactivity/__tests__/ref.spec.ts

@@ -336,4 +336,24 @@ describe('reactivity/ref', () => {
     _trigger!()
     expect(dummy).toBe(2)
   })
+
+  test('should not trigger when setting value to same proxy', () => {
+    const obj = reactive({ count: 0 })
+
+    const a = ref(obj)
+    const spy1 = jest.fn(() => a.value)
+
+    effect(spy1)
+
+    a.value = obj
+    expect(spy1).toBeCalledTimes(1)
+
+    const b = shallowRef(obj)
+    const spy2 = jest.fn(() => b.value)
+
+    effect(spy2)
+
+    b.value = obj
+    expect(spy2).toBeCalledTimes(1)
+  })
 })

+ 7 - 3
packages/reactivity/src/ref.ts

@@ -52,12 +52,15 @@ export function shallowRef(value?: unknown) {
 }
 
 class RefImpl<T> {
+  private _rawValue: T
+
   private _value: T
 
   public readonly __v_isRef = true
 
-  constructor(private _rawValue: T, public readonly _shallow: boolean) {
-    this._value = _shallow ? _rawValue : convert(_rawValue)
+  constructor(value: T, public readonly _shallow = false) {
+    this._rawValue = _shallow ? value : toRaw(value)
+    this._value = _shallow ? value : convert(value)
   }
 
   get value() {
@@ -66,7 +69,8 @@ class RefImpl<T> {
   }
 
   set value(newVal) {
-    if (hasChanged(toRaw(newVal), this._rawValue)) {
+    newVal = this._shallow ? newVal : toRaw(newVal)
+    if (hasChanged(newVal, this._rawValue)) {
       this._rawValue = newVal
       this._value = this._shallow ? newVal : convert(newVal)
       trigger(toRaw(this), TriggerOpTypes.SET, 'value', newVal)