From 7ee27acbc6e8bd5fac42e4d6de961006db121761 Mon Sep 17 00:00:00 2001 From: daiwei Date: Wed, 19 Jan 2022 22:55:05 +0800 Subject: [PATCH 1/2] fix(compiler-core): handle v-memo in template v-for --- .../__tests__/transforms/__snapshots__/vMemo.spec.ts.snap | 2 +- packages/compiler-core/src/transforms/vFor.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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 349eb97a468..7627d8fd3da 100644 --- a/packages/compiler-core/__tests__/transforms/__snapshots__/vMemo.spec.ts.snap +++ b/packages/compiler-core/__tests__/transforms/__snapshots__/vMemo.spec.ts.snap @@ -36,7 +36,7 @@ exports[`compiler: v-memo transform on template v-for 1`] = ` export function render(_ctx, _cache) { return (_openBlock(), _createElementBlock(\\"div\\", null, [ (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.list, ({ x, y }, __, ___, _cached) => { - const _memo = ([x, y === z]) + const _memo = ([x, y === _ctx.z]) if (_cached && _cached.key === x && _isMemoSame(_cached, _memo)) return _cached const _item = (_openBlock(), _createElementBlock(\\"span\\", { key: x }, \\"foobar\\")) _item.memo = _memo diff --git a/packages/compiler-core/src/transforms/vFor.ts b/packages/compiler-core/src/transforms/vFor.ts index f1d739dc3f3..f40eadf90cb 100644 --- a/packages/compiler-core/src/transforms/vFor.ts +++ b/packages/compiler-core/src/transforms/vFor.ts @@ -60,6 +60,14 @@ export const transformFor = createStructuralDirectiveTransform( forNode.source ]) as ForRenderListExpression const memo = findDir(node, 'memo') + + if (memo && isTemplateNode(node)) { + memo.exp = processExpression( + memo.exp! as SimpleExpressionNode, + context + ) + } + const keyProp = findProp(node, `key`) const keyExp = keyProp && From 06aba4a53c338be4a83678e5692024a1d8e17091 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 21 Jan 2022 01:45:06 -0500 Subject: [PATCH 2/2] Update vFor.ts --- packages/compiler-core/src/transforms/vFor.ts | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/packages/compiler-core/src/transforms/vFor.ts b/packages/compiler-core/src/transforms/vFor.ts index f40eadf90cb..e72c64c1a58 100644 --- a/packages/compiler-core/src/transforms/vFor.ts +++ b/packages/compiler-core/src/transforms/vFor.ts @@ -59,15 +59,8 @@ export const transformFor = createStructuralDirectiveTransform( const renderExp = createCallExpression(helper(RENDER_LIST), [ forNode.source ]) as ForRenderListExpression + const isTemplate = isTemplateNode(node) const memo = findDir(node, 'memo') - - if (memo && isTemplateNode(node)) { - memo.exp = processExpression( - memo.exp! as SimpleExpressionNode, - context - ) - } - const keyProp = findProp(node, `key`) const keyExp = keyProp && @@ -76,21 +69,23 @@ export const transformFor = createStructuralDirectiveTransform( : keyProp.exp!) const keyProperty = keyProp ? createObjectProperty(`key`, keyExp!) : null - if ( - !__BROWSER__ && - context.prefixIdentifiers && - keyProperty && - keyProp!.type !== NodeTypes.ATTRIBUTE - ) { - // #2085 process :key expression needs to be processed in order for it - // to behave consistently for