Skip to content

Commit a211e27

Browse files
authored
fix(v-memo): ensure track block when returning cached vnode (#4270)
fix #4253
1 parent 3b60358 commit a211e27

File tree

3 files changed

+12
-10
lines changed

3 files changed

+12
-10
lines changed

packages/compiler-core/__tests__/transforms/__snapshots__/vMemo.spec.ts.snap

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export function render(_ctx, _cache) {
3737
return (_openBlock(), _createElementBlock(\\"div\\", null, [
3838
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, ({ x, y }, __, ___, _cached) => {
3939
const _memo = ([x, y === z])
40-
if (_cached && _cached.key === x && _isMemoSame(_cached.memo, _memo)) return _cached
40+
if (_cached && _cached.key === x && _isMemoSame(_cached, _memo)) return _cached
4141
const _item = (_openBlock(), _createElementBlock(\\"span\\", { key: x }, \\"foobar\\"))
4242
_item.memo = _memo
4343
return _item
@@ -53,7 +53,7 @@ export function render(_ctx, _cache) {
5353
return (_openBlock(), _createElementBlock(\\"div\\", null, [
5454
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, ({ x, y }, __, ___, _cached) => {
5555
const _memo = ([x, y === _ctx.z])
56-
if (_cached && _cached.key === x && _isMemoSame(_cached.memo, _memo)) return _cached
56+
if (_cached && _cached.key === x && _isMemoSame(_cached, _memo)) return _cached
5757
const _item = (_openBlock(), _createElementBlock(\\"div\\", { key: x }, [
5858
_createElementVNode(\\"span\\", null, \\"foobar\\")
5959
]))

packages/compiler-core/src/transforms/vFor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ export const transformFor = createStructuralDirectiveTransform(
209209
...(keyExp ? [` && _cached.key === `, keyExp] : []),
210210
` && ${context.helperString(
211211
IS_MEMO_SAME
212-
)}(_cached.memo, _memo)) return _cached`
212+
)}(_cached, _memo)) return _cached`
213213
]),
214214
createCompoundExpression([`const _item = `, childBlock as any]),
215215
createSimpleExpression(`_item.memo = _memo`),

packages/runtime-core/src/helpers/withMemo.ts

+9-7
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,25 @@ export function withMemo(
77
index: number
88
) {
99
const cached = cache[index] as VNode | undefined
10-
if (cached && isMemoSame(cached.memo!, memo)) {
11-
// make sure to let parent block track it when returning cached
12-
if (isBlockTreeEnabled > 0 && currentBlock) {
13-
currentBlock.push(cached)
14-
}
10+
if (cached && isMemoSame(cached, memo)) {
1511
return cached
1612
}
1713
const ret = render()
1814
ret.memo = memo
1915
return (cache[index] = ret)
2016
}
2117

22-
export function isMemoSame(prev: any[], next: any[]) {
18+
export function isMemoSame(cached: VNode, memo: any[]) {
19+
const prev: any[] = cached.memo!
2320
for (let i = 0; i < prev.length; i++) {
24-
if (prev[i] !== next[i]) {
21+
if (prev[i] !== memo[i]) {
2522
return false
2623
}
2724
}
25+
26+
// make sure to let parent block track it when returning cached
27+
if (isBlockTreeEnabled > 0 && currentBlock) {
28+
currentBlock.push(cached)
29+
}
2830
return true
2931
}

0 commit comments

Comments
 (0)