]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor(vapor): drop `v-memo` (#288)
authorKevin Deng 三咲智子 <sxzz@sxzz.moe>
Sun, 17 Nov 2024 20:51:15 +0000 (04:51 +0800)
committerGitHub <noreply@github.com>
Sun, 17 Nov 2024 20:51:15 +0000 (04:51 +0800)
* refactor(runtime-vapor): drop memo

* drop

packages/compiler-vapor/__tests__/transforms/__snapshots__/vFor.spec.ts.snap
packages/compiler-vapor/__tests__/transforms/__snapshots__/vOnce.spec.ts.snap
packages/compiler-vapor/src/generators/for.ts
packages/compiler-vapor/src/ir/index.ts
packages/compiler-vapor/src/transforms/vFor.ts
packages/runtime-vapor/src/apiCreateFor.ts
packages/runtime-vapor/src/memo.ts [deleted file]
packages/runtime-vapor/src/renderEffect.ts

index b77a3f7cdb8360e0236da11a28214e92e3d7d44b..344f7ac5a2eacd06101ce43f9a63711b208d39e3 100644 (file)
@@ -72,7 +72,7 @@ export function render(_ctx) {
       const n4 = t0()
       _renderEffect(() => _setText(n4, _ctx1[0].value+_ctx0[0].value))
       return n4
-    }, null, null, n5)
+    }, null, n5)
     _insert(n2, n5)
     return n5
   })
index 5957dae88099c8d523b7b2c8e583e6ee99ed6b83..213879feabd33f249a3310cf31cb5f42f831e558 100644 (file)
@@ -71,7 +71,7 @@ export function render(_ctx) {
   const n0 = _createFor(() => (_ctx.list), (_ctx0) => {
     const n2 = t0()
     return n2
-  }, null, null, null, null, true)
+  }, null, null, null, true)
   return n0
 }"
 `;
index 8a90901d4551f80ca104ed27354c102f54227323..723d97cbc4301475e1a6a70c18db9b00aa775c8d 100644 (file)
@@ -16,18 +16,8 @@ export function genFor(
   context: CodegenContext,
 ): CodeFragment[] {
   const { vaporHelper } = context
-  const {
-    source,
-    value,
-    key,
-    index,
-    render,
-    keyProp,
-    once,
-    id,
-    memo,
-    container,
-  } = oper
+  const { source, value, key, index, render, keyProp, once, id, container } =
+    oper
 
   let isDestructure = false
   let rawValue: string | null = null
@@ -71,7 +61,6 @@ export function genFor(
       sourceExpr,
       blockFn,
       genCallback(keyProp),
-      genCallback(memo),
       container != null && `n${container}`,
       false, // todo: hydrationNode
       once && 'true',
index 8b887e9249fc45ad654a200f52eec683eab81c4a..9cca9bf3ca1385ebbb481a4ee11b79a6b54eca65 100644 (file)
@@ -78,7 +78,6 @@ export interface IRFor {
   value?: SimpleExpressionNode
   key?: SimpleExpressionNode
   index?: SimpleExpressionNode
-  memo?: SimpleExpressionNode
 }
 
 export interface ForIRNode extends BaseIRNode, IRFor {
index 735c086bf273d5e351451248a4d3cc017e91a829..020822478aea77fe2ec8d462e13a2ddfdefc1bd0 100644 (file)
@@ -15,7 +15,7 @@ import {
   IRNodeTypes,
   type VaporDirectiveNode,
 } from '../ir'
-import { findDir, findProp, propToExpression } from '../utils'
+import { findProp, propToExpression } from '../utils'
 import { newBlock, wrapTemplate } from './utils'
 
 export const transformVFor: NodeTransform = createStructuralDirectiveTransform(
@@ -45,7 +45,6 @@ export function processFor(
   const { source, value, key, index } = parseResult
 
   const keyProp = findProp(node, 'key')
-  const memo = findDir(node, 'memo')
   const keyProperty = keyProp && propToExpression(keyProp)
   context.node = node = wrapTemplate(node, ['for'])
   context.dynamic.flags |= DynamicFlag.NON_TEMPLATE | DynamicFlag.INSERT
@@ -75,7 +74,6 @@ export function processFor(
       keyProp: keyProperty,
       render,
       once: context.inVOnce,
-      memo: memo && memo.exp,
       container,
     })
   }
index e8dcdb598c7976dcbf8bbf6e5f6e3524eb770403..0344dcdbb23f29e22202c3739d9cbb3ce5fb9f7b 100644 (file)
@@ -17,7 +17,6 @@ import { currentInstance } from './component'
 import { componentKey } from './component'
 import type { DynamicSlot } from './componentSlots'
 import { renderEffect } from './renderEffect'
-import { withMemo } from './memo'
 
 interface ForBlock extends Fragment {
   scope: EffectScope
@@ -27,7 +26,6 @@ interface ForBlock extends Fragment {
     index: ShallowRef<number | undefined>,
   ]
   key: any
-  memo: any[] | undefined
 }
 
 type Source = any[] | Record<any, any> | number | Set<any> | Map<any, any>
@@ -37,7 +35,6 @@ export const createFor = (
   src: () => Source,
   renderItem: (block: ForBlock['state']) => Block,
   getKey?: (item: any, key: any, index?: number) => any,
-  getMemo?: (item: any, key: any, index?: number) => any[],
   container?: ParentNode,
   hydrationNode?: Node,
   once?: boolean,
@@ -61,7 +58,6 @@ export const createFor = (
     warn('createFor() can only be used inside setup()')
   }
 
-  const update = getMemo ? updateWithMemo : updateWithoutMemo
   once ? renderList() : renderEffect(renderList)
 
   return ref
@@ -276,23 +272,9 @@ export const createFor = (
       scope,
       state,
       key: getKey && getKey(item, key, index),
-      memo: getMemo && getMemo(item, key, index),
       [fragmentKey]: true,
     })
-    block.nodes = scope.run(() => {
-      if (getMemo) {
-        return withMemo(
-          () =>
-            getMemo(
-              block.state[0].value,
-              block.state[1].value,
-              block.state[2].value,
-            ),
-          () => renderItem(state),
-        )
-      }
-      return renderItem(state)
-    })!
+    block.nodes = scope.run(() => renderItem(state))!
 
     if (parent) insert(block.nodes, parent, anchor)
 
@@ -314,28 +296,7 @@ export const createFor = (
     }
   }
 
-  function updateWithMemo(
-    block: ForBlock,
-    newItem: any,
-    newKey = block.state[1].value,
-    newIndex = block.state[2].value,
-  ) {
-    const [, key, index] = block.state
-    let needsUpdate = newKey !== key.value || newIndex !== index.value
-    if (!needsUpdate) {
-      const oldMemo = block.memo!
-      const newMemo = (block.memo = getMemo!(newItem, newKey, newIndex))
-      for (let i = 0; i < newMemo.length; i++) {
-        if ((needsUpdate = newMemo[i] !== oldMemo[i])) {
-          break
-        }
-      }
-    }
-
-    if (needsUpdate) updateState(block, newItem, newKey, newIndex)
-  }
-
-  function updateWithoutMemo(
+  function update(
     block: ForBlock,
     newItem: any,
     newKey = block.state[1].value,
diff --git a/packages/runtime-vapor/src/memo.ts b/packages/runtime-vapor/src/memo.ts
deleted file mode 100644 (file)
index 28892b3..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-export const memoStack: Array<() => any[]> = []
-
-export function withMemo<T>(memo: () => any[], callback: () => T): T {
-  memoStack.push(memo)
-  const res = callback()
-  memoStack.pop()
-  return res
-}
index 9e4c3872381a371fdead1980e0f5e7a8fe1e1b6a..807145681455c3f9e51ea23fc21540f59317a6f3 100644 (file)
@@ -12,7 +12,6 @@ import {
   queuePostFlushCb,
 } from './scheduler'
 import { VaporErrorCodes, callWithAsyncErrorHandling } from './errorHandling'
-import { memoStack } from './memo'
 
 export function renderEffect(cb: () => void): void {
   const instance = getCurrentInstance()
@@ -33,13 +32,6 @@ export function renderEffect(cb: () => void): void {
     job.id = instance.uid
   }
 
-  let memos: (() => any[])[] | undefined
-  let memoCaches: any[][]
-  if (memoStack.length) {
-    memos = Array.from(memoStack)
-    memoCaches = memos.map(memo => memo())
-  }
-
   const effect = new ReactiveEffect(() =>
     callWithAsyncErrorHandling(cb, instance, VaporErrorCodes.RENDER_FUNCTION),
   )
@@ -60,28 +52,6 @@ export function renderEffect(cb: () => void): void {
       return
     }
 
-    if (memos) {
-      let dirty: boolean | undefined
-      for (let i = 0; i < memos.length; i++) {
-        const memo = memos[i]
-        const cache = memoCaches[i]
-        const value = memo()
-
-        for (let j = 0; j < Math.max(value.length, cache.length); j++) {
-          if (value[j] !== cache[j]) {
-            dirty = true
-            break
-          }
-        }
-
-        memoCaches[i] = value
-      }
-
-      if (!dirty) {
-        return
-      }
-    }
-
     const reset = instance && setCurrentInstance(instance)
 
     if (instance && instance.isMounted && !instance.isUpdating) {