fix(runtime-core): handle NaN identity check in v-memo (#5852)

fix #5853
This commit is contained in:
huangcheng 2022-05-13 07:49:51 +08:00 committed by GitHub
parent d36ca4d80e
commit a3881299e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 1 deletions

View File

@ -210,4 +210,17 @@ describe('v-memo', () => {
// should update
expect(el.innerHTML).toBe(`<div>2</div><div>2</div><div>2</div>`)
})
test('v-memo dependency is NaN should be equal', async () => {
const [el, vm] = mount({
template: `<div v-memo="[x]">{{ y }}</div>`,
data: () => ({ x: NaN, y: 0 })
})
expect(el.innerHTML).toBe(`<div>0</div>`)
vm.y++
// should not update
await nextTick()
expect(el.innerHTML).toBe(`<div>0</div>`)
})
})

View File

@ -1,3 +1,4 @@
import { hasChanged } from '@vue/shared'
import { currentBlock, isBlockTreeEnabled, VNode } from '../vnode'
export function withMemo(
@ -22,8 +23,9 @@ export function isMemoSame(cached: VNode, memo: any[]) {
if (prev.length != memo.length) {
return false
}
for (let i = 0; i < prev.length; i++) {
if (prev[i] !== memo[i]) {
if (hasChanged(prev[i], memo[i])) {
return false
}
}