From: daiwei Date: Wed, 15 Jan 2025 02:37:04 +0000 (+0800) Subject: wip: save X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=783d60a4d033cbfd7471ff5fcb243707cef68cd2;p=thirdparty%2Fvuejs%2Fcore.git wip: save --- diff --git a/packages/compiler-core/__tests__/transforms/__snapshots__/vMemo.spec.ts.snap b/packages/compiler-core/__tests__/transforms/__snapshots__/vMemo.spec.ts.snap index 0ec8072930..b561bde6dd 100644 --- a/packages/compiler-core/__tests__/transforms/__snapshots__/vMemo.spec.ts.snap +++ b/packages/compiler-core/__tests__/transforms/__snapshots__/vMemo.spec.ts.snap @@ -7,12 +7,12 @@ export function render(_ctx, _cache) { return (_openBlock(), _createElementBlock("div", null, [ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.tableData, (data, _key, ___, _cached) => { const _memo = (_ctx.getLetter(data)) - if (_cached && _cached.key === _ctx.getId(data) && _isMemoSame(_cached, _memo)) return _cached + if (_cached && _cached.el && _cached.key === _ctx.getId(data) && _isMemoSame(_cached, _memo)) return _cached const _item = (_openBlock(), _createElementBlock("span", { key: _ctx.getId(data) })) _item.memo = _memo - _item.cacheIndex = _key + _item.cacheIndex = [0, _key] return _item }, _cache, 0), 128 /* KEYED_FRAGMENT */)) ])) @@ -56,10 +56,10 @@ export function render(_ctx, _cache) { return (_openBlock(), _createElementBlock("div", null, [ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, ({ x, y }, _key, ___, _cached) => { const _memo = ([x, y === _ctx.z]) - if (_cached && _cached.key === x && _isMemoSame(_cached, _memo)) return _cached + if (_cached && _cached.el && _cached.key === x && _isMemoSame(_cached, _memo)) return _cached const _item = (_openBlock(), _createElementBlock("span", { key: x }, "foobar")) _item.memo = _memo - _item.cacheIndex = _key + _item.cacheIndex = [0, _key] return _item }, _cache, 0), 128 /* KEYED_FRAGMENT */)) ])) @@ -73,12 +73,12 @@ export function render(_ctx, _cache) { return (_openBlock(), _createElementBlock("div", null, [ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, ({ x, y }, _key, ___, _cached) => { const _memo = ([x, y === _ctx.z]) - if (_cached && _cached.key === x && _isMemoSame(_cached, _memo)) return _cached + if (_cached && _cached.el && _cached.key === x && _isMemoSame(_cached, _memo)) return _cached const _item = (_openBlock(), _createElementBlock("div", { key: x }, [ _createElementVNode("span", null, "foobar") ])) _item.memo = _memo - _item.cacheIndex = _key + _item.cacheIndex = [0, _key] return _item }, _cache, 0), 128 /* KEYED_FRAGMENT */)) ])) diff --git a/packages/compiler-core/src/transforms/vFor.ts b/packages/compiler-core/src/transforms/vFor.ts index 5d1ceb30cb..872965d5ac 100644 --- a/packages/compiler-core/src/transforms/vFor.ts +++ b/packages/compiler-core/src/transforms/vFor.ts @@ -227,7 +227,7 @@ export const transformFor: NodeTransform = createStructuralDirectiveTransform( loop.body = createBlockStatement([ createCompoundExpression([`const _memo = (`, memo.exp!, `)`]), createCompoundExpression([ - `if (_cached`, + `if (_cached && _cached.el`, ...(keyExp ? [` && _cached.key === `, keyExp] : []), ` && ${context.helperString( IS_MEMO_SAME, @@ -235,7 +235,9 @@ export const transformFor: NodeTransform = createStructuralDirectiveTransform( ]), createCompoundExpression([`const _item = `, childBlock as any]), createSimpleExpression(`_item.memo = _memo`), - createSimpleExpression(`_item.cacheIndex = _key`), + createSimpleExpression( + `_item.cacheIndex = [${context.cached.length}, _key]`, + ), createSimpleExpression(`return _item`), ]) renderExp.arguments.push( diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 90cc22f547..ee3c2167d7 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -2097,7 +2097,15 @@ function baseCreateRenderer( // #6593 should clean memo cache when unmount if (cacheIndex != null) { - parentComponent!.renderCache[cacheIndex] = undefined + if (isArray(cacheIndex)) { + const [parentIndex, itemIndex] = cacheIndex + const parentCache = parentComponent!.renderCache[ + parentIndex + ]! as unknown as VNode[] + parentCache[itemIndex].el = null + } else { + parentComponent!.renderCache[cacheIndex] = undefined + } } if (shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE) { diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index a8c5340cd1..97a9e8b234 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -243,8 +243,9 @@ export interface VNode< memo?: any[] /** * @internal index for cleaning v-memo cache + * cacheIndex will be an array when vnode in vFor */ - cacheIndex?: number + cacheIndex?: number | number[] /** * @internal __COMPAT__ only */