DEBUG.WIKI
腾讯云;让你的想法跑起来;轻量服务器 · 建站 / Docker / API;查看产品 →
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

defineModel 默认工厂引用解构 prop 报 PARSE_ERROR,改用工厂参数

defineModel 的默认工厂读取解构 prop,可能在3.5.43生成损坏代码;3.5.44改为明确拒绝。使用默认工厂参数,保留初始化与同步边界。

Vue 3.5.43项目中,组件源码括号完整,构建却报 [PARSE_ERROR] Expected ',' or ')' but found 'Identifier',错误位置出现 "modelValue"__props.defaultValue 这样的拼接。若代码在 defineModel() 的 default 工厂里读取了 defineProps() 解构变量,应检查选项提升与解构转换的边界。

下面就是这一组合的简化形式:

<script setup lang="ts">
const { defaultValue = '' } = defineProps<{ defaultValue?: string }>();
const model = defineModel<string>({
  default: () => defaultValue,
});
</script>

<template>
  <input v-model="model" />
</template>

3.5起,Vue会将相同 <script setup> 内的解构prop读取改写为props访问,但 defineModel 的prop选项会被提升到setup外。default工厂闭包看似处于同一个词法块,实际上不能依赖这个setup局部绑定。

3.5.44 的修复会换成明确错误,不会让原写法合法

3.5.43的转换在这一位置会写坏输出,后续解析器才报语法错误。继续给源码增加逗号或换一个压缩器,解决不了转换范围的问题。

Vue 3.5.44已于2026年10月13日修复这类输出损坏,但处理方式是提前拒绝不合法引用,提示 prop options cannot reference destructured props,并说明选项被提升到setup外。升级后看见这条错误,说明失败位置更清楚了;不能理解成升级失败,也不能期待原来那段闭包不改就通过。

从 default 工厂自己的 props 参数取值

这个默认值依赖另一个prop时,应使用默认工厂收到的参数。下面保留可选字符串的含义,并对工厂参数中的值做类型收窄:

<script setup lang="ts">
defineProps<{ defaultValue?: string }>();

const model = defineModel<string>({
  default: (props: Record<string, unknown>) =>
    typeof props.defaultValue === 'string' ? props.defaultValue : '',
});
</script>

<template>
  <input v-model="model" />
</template>

工厂使用自己的参数,不再捕获setup里的解构变量。示例没有把未知值直接断言成字符串;真实组件若接受其他类型,应保留原来的校验与默认规则。不要把整个工厂加 @ts-ignore 后继续读取原来的局部变量,类型检查关闭也不会改变编译提升位置。

组件如果仍在其他setup逻辑中使用解构prop,可以保留那里的解构。需要改的是被提升的prop选项对setup绑定的依赖,不是全文件禁止解构,也不是所有 defineModel 的 get、set 都采用同一套默认工厂语义。

默认值不是持续同步逻辑

default工厂用于取得缺省值,不意味着后续 defaultValue 每次变化都重新设置model。若业务需要持续跟随另一个prop,应重新明确受控值和更新事件的关系,不能把初始化工厂当成watcher。

还要分别检查父组件有无传入model。父级没有提供值、子级有default时,父子状态可能暂时不一致;编译错误修好不会自动消除这项既有语义。需要同步初始状态的业务,应明确在父级初始化还是由更新事件传回,而不是仅凭子组件输入框显示正常就认为双向数据一致。

重新构建后,确认不再生成拼接损坏的 _useModel 调用,并在父级显式传值、缺省值和后续输入三种情况下检查实际模型。更新依赖时核对真实解析到的compiler-sfc版本,保留运行时与编译器的兼容组合。