Просмотр исходного кода

fix(reactivity): ensure readonly on plain arrays doesn't track array methods. (#2506)

fix #2493
Thorsten Lünborg 5 лет назад
Родитель
Сommit
34703082fd

+ 10 - 0
packages/reactivity/__tests__/readonly.spec.ts

@@ -375,6 +375,16 @@ describe('reactivity/readonly', () => {
     expect(dummy).toBe(1)
   })
 
+  test('readonly array should not track', () => {
+    const arr = [1]
+    const roArr = readonly(arr)
+
+    const eff = effect(() => {
+      roArr.includes(2)
+    })
+    expect(eff.deps.length).toBe(0)
+  })
+
   test('readonly should track and trigger if wrapping reactive original (collection)', () => {
     const a = reactive(new Map())
     const b = readonly(a)

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

@@ -83,7 +83,8 @@ function createGetter(isReadonly = false, shallow = false) {
     }
 
     const targetIsArray = isArray(target)
-    if (targetIsArray && hasOwn(arrayInstrumentations, key)) {
+
+    if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {
       return Reflect.get(arrayInstrumentations, key, receiver)
     }