使用Vue与Axios开发时控制台报渲染错误:无法读取undefined的first_name但页面正常显示
报错根本原因
这个报错完全是异步请求和Vue首次渲染的时间差导致的,和你能否最终正常显示内容没有任何冲突:
- 你在
data里初始化collection.data为空数组[],但接口返回的data是带contactInfos属性的对象,初始状态的结构和渲染期望的结构完全不匹配。模板第一次执行渲染逻辑时,沿着取值路径找:collection.data.contactInfos这一级本身就是undefined,这时候强行读取它上面的first_name属性,就会触发你控制台看到的TypeError - 等Axios异步请求完成,把接口返回的
response.data赋值给collection.data之后,Vue会触发响应式更新重新渲染模板,这时候contactInfos属性已经存在,就能正常读到first_name并显示在页面上——这就是为什么最终页面能看到正确内容,但控制台先抛了一次错的核心逻辑。
具体解决方案
- 直接在模板取值时加可选链运算符,把原来的取值改成
{{collection.data?.contactInfos?.first_name}},只要属性路径上某一级不存在,Vue会直接渲染空值,不会抛出读取属性的错误,等接口数据返回后会自动更新渲染结果 - 初始化data时就补全完整的属性结构,避免首渲染时路径上出现
undefined。比如把data部分改成:
data(){ return { collection:{ data: { contactInfos: { first_name: '' } } } } }
这样首渲染时虽然字段值是空字符串,但整条属性路径是完整的,不会触发报错,等接口数据回来后会自动覆盖更新为真实值。
- 给渲染容器加存在性判断,等目标数据加载完成后再渲染对应内容,比如:
<span v-if="collection.data?.contactInfos" class="d-block info-content"> {{collection.data.contactInfos.first_name}} </span>
数据未加载完成时这个span不会参与渲染流程,自然不会触发不存在属性的读取报错。
内容的提问来源于stack exchange,提问作者user13729875
相关产品推荐
相关产品推荐

