Skip to content

Commit 6224288

Browse files
authored
fix(compile-core): fix v-model with newlines edge case (#11960)
close #8306
1 parent 902bd9c commit 6224288

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

packages/compiler-core/src/transforms/vModel.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const transformModel: DirectiveTransform = (dir, node, context) => {
3131

3232
// we assume v-model directives are always parsed
3333
// (not artificially created by a transform)
34-
const rawExp = exp.loc.source
34+
const rawExp = exp.loc.source.trim()
3535
const expString =
3636
exp.type === NodeTypes.SIMPLE_EXPRESSION ? exp.content : rawExp
3737

packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap

+23
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,29 @@ return (_ctx, _cache) => {
10841084
}"
10851085
`;
10861086
1087+
exports[`SFC compile <script setup> > inlineTemplate mode > v-model w/ newlines codegen 1`] = `
1088+
"import { unref as _unref, isRef as _isRef, vModelText as _vModelText, withDirectives as _withDirectives, openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue"
1089+
1090+
1091+
export default {
1092+
setup(__props) {
1093+
1094+
const count = ref(0)
1095+
1096+
return (_ctx, _cache) => {
1097+
return _withDirectives((_openBlock(), _createElementBlock("input", {
1098+
"onUpdate:modelValue": _cache[0] || (_cache[0] = $event => (_isRef(count) ? (count).value = $event : null))
1099+
}, null, 512 /* NEED_PATCH */)), [
1100+
[_vModelText,
1101+
_unref(count)
1102+
]
1103+
])
1104+
}
1105+
}
1106+
1107+
}"
1108+
`;
1109+
10871110
exports[`SFC compile <script setup> > inlineTemplate mode > with defineExpose() 1`] = `
10881111
"
10891112
export default {

packages/compiler-sfc/__tests__/compileScript.spec.ts

+17
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,23 @@ describe('SFC compile <script setup>', () => {
472472
assertCode(content)
473473
})
474474

475+
test('v-model w/ newlines codegen', () => {
476+
const { content } = compile(
477+
`<script setup>
478+
const count = ref(0)
479+
</script>
480+
<template>
481+
<input v-model="
482+
count
483+
">
484+
</template>
485+
`,
486+
{ inlineTemplate: true },
487+
)
488+
expect(content).toMatch(`_isRef(count) ? (count).value = $event : null`)
489+
assertCode(content)
490+
})
491+
475492
test('v-model should not generate ref assignment code for non-setup bindings', () => {
476493
const { content } = compile(
477494
`<script setup>

0 commit comments

Comments
 (0)