diff --git a/packages/compiler-core/src/transforms/vModel.ts b/packages/compiler-core/src/transforms/vModel.ts
index 169959946..bf5e69beb 100644
--- a/packages/compiler-core/src/transforms/vModel.ts
+++ b/packages/compiler-core/src/transforms/vModel.ts
@@ -48,8 +48,9 @@ export const transformModel: DirectiveTransform = (dir, node, context) => {
const maybeRef =
!__BROWSER__ &&
context.inline &&
- bindingType &&
- bindingType !== BindingTypes.SETUP_CONST
+ (bindingType === BindingTypes.SETUP_LET ||
+ bindingType === BindingTypes.SETUP_REF ||
+ bindingType === BindingTypes.SETUP_MAYBE_REF)
if (
!expString.trim() ||
diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts
index bf562defd..b0a6c115e 100644
--- a/packages/compiler-sfc/__tests__/compileScript.spec.ts
+++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts
@@ -673,6 +673,26 @@ defineExpose({ foo: 123 })
assertCode(content)
})
+ test('v-model should not generate ref assignment code for non-setup bindings', () => {
+ const { content } = compile(
+ `
+
+
+
+
+ `,
+ { inlineTemplate: true }
+ )
+ expect(content).not.toMatch(`_isRef(foo)`)
+ })
+
test('template assignment expression codegen', () => {
const { content } = compile(
`