fix(v-memo): ensure track block when returning cached vnode (#4270)
fix #4253
This commit is contained in:
parent
3b60358d0e
commit
a211e271ee
@ -37,7 +37,7 @@ export function render(_ctx, _cache) {
|
|||||||
return (_openBlock(), _createElementBlock(\\"div\\", null, [
|
return (_openBlock(), _createElementBlock(\\"div\\", null, [
|
||||||
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, ({ x, y }, __, ___, _cached) => {
|
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, ({ x, y }, __, ___, _cached) => {
|
||||||
const _memo = ([x, y === z])
|
const _memo = ([x, y === z])
|
||||||
if (_cached && _cached.key === x && _isMemoSame(_cached.memo, _memo)) return _cached
|
if (_cached && _cached.key === x && _isMemoSame(_cached, _memo)) return _cached
|
||||||
const _item = (_openBlock(), _createElementBlock(\\"span\\", { key: x }, \\"foobar\\"))
|
const _item = (_openBlock(), _createElementBlock(\\"span\\", { key: x }, \\"foobar\\"))
|
||||||
_item.memo = _memo
|
_item.memo = _memo
|
||||||
return _item
|
return _item
|
||||||
@ -53,7 +53,7 @@ export function render(_ctx, _cache) {
|
|||||||
return (_openBlock(), _createElementBlock(\\"div\\", null, [
|
return (_openBlock(), _createElementBlock(\\"div\\", null, [
|
||||||
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, ({ x, y }, __, ___, _cached) => {
|
(_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, ({ x, y }, __, ___, _cached) => {
|
||||||
const _memo = ([x, y === _ctx.z])
|
const _memo = ([x, y === _ctx.z])
|
||||||
if (_cached && _cached.key === x && _isMemoSame(_cached.memo, _memo)) return _cached
|
if (_cached && _cached.key === x && _isMemoSame(_cached, _memo)) return _cached
|
||||||
const _item = (_openBlock(), _createElementBlock(\\"div\\", { key: x }, [
|
const _item = (_openBlock(), _createElementBlock(\\"div\\", { key: x }, [
|
||||||
_createElementVNode(\\"span\\", null, \\"foobar\\")
|
_createElementVNode(\\"span\\", null, \\"foobar\\")
|
||||||
]))
|
]))
|
||||||
|
@ -209,7 +209,7 @@ export const transformFor = createStructuralDirectiveTransform(
|
|||||||
...(keyExp ? [` && _cached.key === `, keyExp] : []),
|
...(keyExp ? [` && _cached.key === `, keyExp] : []),
|
||||||
` && ${context.helperString(
|
` && ${context.helperString(
|
||||||
IS_MEMO_SAME
|
IS_MEMO_SAME
|
||||||
)}(_cached.memo, _memo)) return _cached`
|
)}(_cached, _memo)) return _cached`
|
||||||
]),
|
]),
|
||||||
createCompoundExpression([`const _item = `, childBlock as any]),
|
createCompoundExpression([`const _item = `, childBlock as any]),
|
||||||
createSimpleExpression(`_item.memo = _memo`),
|
createSimpleExpression(`_item.memo = _memo`),
|
||||||
|
@ -7,11 +7,7 @@ export function withMemo(
|
|||||||
index: number
|
index: number
|
||||||
) {
|
) {
|
||||||
const cached = cache[index] as VNode | undefined
|
const cached = cache[index] as VNode | undefined
|
||||||
if (cached && isMemoSame(cached.memo!, memo)) {
|
if (cached && isMemoSame(cached, memo)) {
|
||||||
// make sure to let parent block track it when returning cached
|
|
||||||
if (isBlockTreeEnabled > 0 && currentBlock) {
|
|
||||||
currentBlock.push(cached)
|
|
||||||
}
|
|
||||||
return cached
|
return cached
|
||||||
}
|
}
|
||||||
const ret = render()
|
const ret = render()
|
||||||
@ -19,11 +15,17 @@ export function withMemo(
|
|||||||
return (cache[index] = ret)
|
return (cache[index] = ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isMemoSame(prev: any[], next: any[]) {
|
export function isMemoSame(cached: VNode, memo: any[]) {
|
||||||
|
const prev: any[] = cached.memo!
|
||||||
for (let i = 0; i < prev.length; i++) {
|
for (let i = 0; i < prev.length; i++) {
|
||||||
if (prev[i] !== next[i]) {
|
if (prev[i] !== memo[i]) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// make sure to let parent block track it when returning cached
|
||||||
|
if (isBlockTreeEnabled > 0 && currentBlock) {
|
||||||
|
currentBlock.push(cached)
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user