diff --git a/packages/compiler-core/src/parser.ts b/packages/compiler-core/src/parser.ts index 95c5e129f25..fc6d22d6692 100644 --- a/packages/compiler-core/src/parser.ts +++ b/packages/compiler-core/src/parser.ts @@ -199,7 +199,7 @@ const tokenizer = new Tokenizer(stack, { ondirname(start, end) { const raw = getSlice(start, end) const name = - raw === '.' || raw === ':' + raw === '.' || raw === ':' || raw === '!' ? 'bind' : raw === '@' ? 'on' @@ -353,6 +353,11 @@ const tokenizer = new Tokenizer(stack, { } } else { // directive + const { rawName } = currentProp + if (rawName && rawName[0] === '!' && currentAttrValue === '') { + currentProp.rawName = `:${rawName.slice(1)}` + currentAttrValue = 'false' + } let expParseMode = ExpParseMode.Normal if (!__BROWSER__) { if (currentProp.name === 'for') { diff --git a/packages/compiler-core/src/tokenizer.ts b/packages/compiler-core/src/tokenizer.ts index 329e8b48181..2fada0bcd30 100644 --- a/packages/compiler-core/src/tokenizer.ts +++ b/packages/compiler-core/src/tokenizer.ts @@ -668,7 +668,8 @@ export default class Tokenizer { c === CharCodes.Dot || c === CharCodes.Colon || c === CharCodes.At || - c === CharCodes.Number + c === CharCodes.Number || + c === CharCodes.ExclamationMark ) { this.cbs.ondirname(this.index, this.index + 1) this.state = State.InDirArg diff --git a/packages/vue/examples/codemeow/useInversionValue.html b/packages/vue/examples/codemeow/useInversionValue.html new file mode 100644 index 00000000000..d3215ff630c --- /dev/null +++ b/packages/vue/examples/codemeow/useInversionValue.html @@ -0,0 +1,47 @@ + + + + +