You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js 3表单v-model绑定REST缺失数据时报undefined错误如何解决

问题根本原因

你报错的本质是直接用接口返回的不完整对象覆盖了data中初始化的完整info对象:你在data里给info定义了带默认值的address嵌套对象,但在created中直接执行this.info = 接口返回对象时,返回对象没有address字段,就会直接把原info里的address整个抹掉,模板访问info.address.street时自然就会抛出undefined错误。

你之前在Svelte中用展开运算符处理不会出问题,本质是做了对象合并,没有直接替换整个带默认值的对象,Vue中也可以用同类逻辑处理,不需要额外开启任何特殊配置。

常用解决方案

  • 方案1:手动合并对象(推荐,层级较浅时用)
    赋值时不要直接替换整个info对象,将接口返回的字段和原有默认值做合并,嵌套层级单独处理即可:
    created() {
      // 假设接口返回数据存在res变量中
      const res = {
        firstname: "Micheal",
        lastname: "Jordan",
      }
      this.info = {
        ...this.info,
        ...res,
        // 嵌套对象也要合并默认值
        address: {
          ...this.info.address,
          ...res.address
        }
      }
    }
    
  • 方案2:用深层合并工具(适合嵌套层级多的场景)
    如果对象嵌套层级多,手动写合并逻辑太繁琐,可以直接用成熟的深层合并工具:
    // 安装lodash-es后导入,比全量lodash更轻量化
    import { merge } from 'lodash-es'
    
    created() {
      const res = { /* 接口返回数据 */ }
      // merge会自动保留原对象中不存在于返回值的字段,不需要手动处理嵌套
      this.info = merge(this.info, res)
    }
    
  • 方案3:模板层兜底兼容
    如果不想改赋值逻辑,也可以直接在模板中用Vue3支持的可选链语法做兜底,避免访问不存在的字段时报错:
    <template>
    <div v-if="info">
      <form>
        <input type="text" v-model="info.firstname">
        <input type="text" v-model="info.lastname">
        <input type="text" v-model="info.address?.street ?? ''">
        <input type="text" v-model="info.address?.city ?? ''">
        <input type="text" v-model="info.address?.postalCode ?? ''">
        <button type="submit">Submit</button> 
      </form>
    </div>
    </template>
    

内容的提问来源于stack exchange,提问作者Steve S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:36:05