diff --git a/packages/compiler-core/__tests__/transforms/vBind.spec.ts b/packages/compiler-core/__tests__/transforms/vBind.spec.ts index ff21351d05d..cc7d9d00ebd 100644 --- a/packages/compiler-core/__tests__/transforms/vBind.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vBind.spec.ts @@ -133,6 +133,21 @@ describe('compiler: transform v-bind', () => { } }) + test('no expression (false shorthand)', () => { + const node = parseWithVBind(`
`) + const props = (node.codegenNode as VNodeCall).props as ObjectExpression + expect(props.properties[0]).toMatchObject({ + key: { + content: `id`, + isStatic: true, + }, + value: { + content: `false`, + isStatic: false, + }, + }) + }) + test('dynamic arg', () => { const node = parseWithVBind(``) const props = (node.codegenNode as VNodeCall).props as CallExpression diff --git a/packages/compiler-core/src/parser.ts b/packages/compiler-core/src/parser.ts index 2d85289fc68..f6f1b979ccf 100644 --- a/packages/compiler-core/src/parser.ts +++ b/packages/compiler-core/src/parser.ts @@ -200,7 +200,7 @@ const tokenizer = new Tokenizer(stack, { ondirname(start, end) { const raw = getSlice(start, end) const name = - raw === '.' || raw === ':' + raw === '!' || raw === '.' || raw === ':' ? 'bind' : raw === '@' ? 'on' @@ -225,7 +225,7 @@ const tokenizer = new Tokenizer(stack, { type: NodeTypes.DIRECTIVE, name, rawName: raw, - exp: undefined, + exp: raw === '!' ? createSimpleExpression('false') : undefined, arg: undefined, modifiers: raw === '.' ? [createSimpleExpression('prop')] : [], loc: getLoc(start), diff --git a/packages/compiler-core/src/tokenizer.ts b/packages/compiler-core/src/tokenizer.ts index b8a74790259..94e577006fd 100644 --- a/packages/compiler-core/src/tokenizer.ts +++ b/packages/compiler-core/src/tokenizer.ts @@ -665,6 +665,7 @@ export default class Tokenizer { this.state = State.InDirName this.sectionStart = this.index } else if ( + c === CharCodes.ExclamationMark || c === CharCodes.Dot || c === CharCodes.Colon || c === CharCodes.At ||