]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(v-memo): should work on v-for with constant expression (#4272)
authoredison <daiwei521@126.com>
Sat, 7 Aug 2021 01:37:09 +0000 (09:37 +0800)
committerGitHub <noreply@github.com>
Sat, 7 Aug 2021 01:37:09 +0000 (21:37 -0400)
fix #4246

packages/runtime-core/__tests__/helpers/withMemo.spec.ts
packages/runtime-core/src/helpers/renderList.ts

index b98b8c2935693fcbb932b1b86a3bf0a412131438..93aac0d8f4b00a9346d472920187102b86129f68 100644 (file)
@@ -147,4 +147,26 @@ describe('v-memo', () => {
       `<div>5 yes z</div><div>2 no z</div><div>3 no z</div>`
     )
   })
+
+  test('on v-for /w constant expression ', async () => {
+    const [el, vm] = mount({
+      template: `<div v-for="item in 3"  v-memo="[count < 2 ? true : count]">
+          {{count}}
+        </div>`,
+      data: () => ({
+        count: 0
+      })
+    })
+    expect(el.innerHTML).toBe(`<div>0</div><div>0</div><div>0</div>`)
+
+    vm.count = 1
+    await nextTick()
+    // should not update
+    expect(el.innerHTML).toBe(`<div>0</div><div>0</div><div>0</div>`)
+
+    vm.count = 2
+    await nextTick()
+    // should update
+    expect(el.innerHTML).toBe(`<div>2</div><div>2</div><div>2</div>`)
+  })
 })
index 543c343ddace9a93441982def6cc4123b4c177ab..9fbf967a8ca31ff5278e25efc34e8dd605cdf139 100644 (file)
@@ -71,7 +71,7 @@ export function renderList(
     }
     ret = new Array(source)
     for (let i = 0; i < source; i++) {
-      ret[i] = renderItem(i + 1, i)
+      ret[i] = renderItem(i + 1, i, undefined, cached && cached[i])
     }
   } else if (isObject(source)) {
     if (source[Symbol.iterator as any]) {