Vue2渲染Laravel返回的关联对象时报TypeError警告如何解决
报错原因
组件首次渲染时,Axios异步请求还未完成,this.user还未被赋值为接口返回的完整数据,此时访问user.company.name相当于在undefined上读取name属性,就会触发类型错误。等接口返回数据完成赋值后,页面可以正常渲染内容,但首次渲染阶段的警告已经抛出。
修复方案
- 方案1:给
user预设符合数据结构的初始值
在组件的data选项中定义user时,提前把关联对象的层级结构补全,不要留空值,保证初始渲染时属性链完整:
这个方案最适合表单双向绑定场景,不会影响v-model的正常赋值,也不会出现额外的渲染闪烁。data() { return { // 预设和后端返回结构一致的默认值 user: { company: { name: '' }, status: {}, role: {} } } } - 方案2:用
v-if控制元素渲染时机
等接口数据加载完成、user对象存在之后,再渲染绑定了深层属性的表单项,避免初始渲染阶段读取不存在的属性:<!-- 可以给表单外层容器统一加判断,不用逐个输入框加 --> <div v-if="user"> <input type="text" placeholder="Company" v-model="user.company.name"> <!-- 其他绑定user属性的元素都放在这里 --> </div> - 注意:不推荐在v-model上使用可选链操作符
部分开发者会尝试写v-model="user?.company?.name",但Vue2中可选链表达式不能作为双向绑定的左值,会导致赋值失败,这个写法仅适合{{ user?.company?.name }}这类纯文本渲染场景,表单绑定不要用。
内容的提问来源于stack exchange,提问作者Dương Hoàng Văn
相关产品推荐
相关产品推荐

