From f11ae5714347f35892813b566d1a80cc4e51997b Mon Sep 17 00:00:00 2001 From: zhangyu96 Date: Fri, 13 Aug 2021 18:21:02 +0800 Subject: [PATCH 1/6] feat(compiler-core): enhance the warning for v-once --- .../__tests__/transforms/vOnce.spec.ts | 28 ++++++++++++++++++- packages/compiler-core/src/errors.ts | 2 ++ .../compiler-core/src/transforms/vOnce.ts | 14 +++++++++- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/packages/compiler-core/__tests__/transforms/vOnce.spec.ts b/packages/compiler-core/__tests__/transforms/vOnce.spec.ts index 553ac1dfac4..ebe85091a79 100644 --- a/packages/compiler-core/__tests__/transforms/vOnce.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vOnce.spec.ts @@ -4,7 +4,8 @@ import { NodeTypes, generate, CompilerOptions, - getBaseTransformPreset + getBaseTransformPreset, + ErrorCodes } from '../../src' import { RENDER_SLOT, SET_BLOCK_TRACKING } from '../../src/runtimeHelpers' @@ -142,4 +143,29 @@ describe('compiler: v-once transform', () => { } }) }) + + test('inside v-for w/ scope variables', () => { + const onError = jest.fn() + transformWithOnce( + `
{{ i }}
`, + { onError } + ) + + expect(onError).toHaveBeenCalledTimes(1) + expect(onError).toHaveBeenCalledWith( + expect.objectContaining({ + code: ErrorCodes.X_V_ONCE_INSIDE_FOR + }) + ) + }) + + test('inside v-for w/o scope variables', () => { + const onError = jest.fn() + transformWithOnce( + `
{{ k }}
`, + { onError } + ) + + expect(onError).toHaveBeenCalledTimes(0) + }) }) diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index 09ec7290135..9d0d6f9e1a6 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -76,6 +76,7 @@ export const enum ErrorCodes { X_V_FOR_NO_EXPRESSION, X_V_FOR_MALFORMED_EXPRESSION, X_V_FOR_TEMPLATE_KEY_PLACEMENT, + X_V_ONCE_INSIDE_FOR, X_V_BIND_NO_EXPRESSION, X_V_ON_NO_EXPRESSION, X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET, @@ -148,6 +149,7 @@ export const errorMessages: Record = { [ErrorCodes.X_V_IF_NO_EXPRESSION]: `v-if/v-else-if is missing expression.`, [ErrorCodes.X_V_IF_SAME_KEY]: `v-if/else branches must use unique keys.`, [ErrorCodes.X_V_ELSE_NO_ADJACENT_IF]: `v-else/v-else-if has no adjacent v-if.`, + [ErrorCodes.X_V_ONCE_INSIDE_FOR]: `v-for scope variables cannot be used inside nested template with v-once.`, [ErrorCodes.X_V_FOR_NO_EXPRESSION]: `v-for is missing expression.`, [ErrorCodes.X_V_FOR_MALFORMED_EXPRESSION]: `v-for has invalid expression.`, [ErrorCodes.X_V_FOR_TEMPLATE_KEY_PLACEMENT]: `