]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: save
authordaiwei <daiwei521@126.com>
Wed, 15 Jan 2025 02:37:04 +0000 (10:37 +0800)
committerdaiwei <daiwei521@126.com>
Wed, 15 Jan 2025 02:37:04 +0000 (10:37 +0800)
packages/compiler-core/__tests__/transforms/__snapshots__/vMemo.spec.ts.snap
packages/compiler-core/src/transforms/vFor.ts
packages/runtime-core/src/renderer.ts
packages/runtime-core/src/vnode.ts

index 0ec807293041ed920e2284bb00ae6b473d6a1c87..b561bde6dd89317f277211d2684310236b17a9e7 100644 (file)
@@ -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 */))
   ]))
index 5d1ceb30cb22b67e3397e415a58edaaced1ad34e..872965d5ac30788ca46f2afc73ceb056bbe5eb93 100644 (file)
@@ -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(
index 90cc22f547032c5a830be2fdda6bc1b96fceeeb3..ee3c2167d7f1e6874c3afa4e19e954bdc4348313 100644 (file)
@@ -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) {
index a8c5340cd1fe167840f700e34a2a25b1909eb048..97a9e8b234b8ed07a00f5497d523e8ec9b509848 100644 (file)
@@ -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
    */