Vue Cannot read property ‘xxx‘ of undefined

一、前言

之前经常遇到这个问题,Vue Cannot read property ‘xxx’ of undefined 今天就总结下,剖析下原因。

二、问题

场景一:获取 table.content.name

<template>
  <div>单位:{{table.content.name}}</div>
<template>
<script>
export default {
  data() {
    return {
      table:{} // 初始的时候赋值为空字符串
    };
  },
  created(){
    this.loadTable()
  },
  methods:{
    async loadTable() {
      const { code, data } = await databoard.getTable();
      if(code === 0){
         this.table = data
         // 后端返回的格式是
         // table:{
         //   title:'经济',
         //   content:{
          //     name:'经济'
         //   }
        // }
      }
    }
  }
}
<script>

结果:运行之后报错,虽然报错了但数据可以显示出来
在这里插入图片描述场景二:把代码稍做改动,取 table.title

<template>
  <div>单位:{{table.title}}</div>
<template>
<script>
export default {
  data() {
    return {
      table:{} // 初始的时候赋值为空字符串
    };
  },
  created(){
    this.loadTable()
  },
  methods:{
    async loadTable() {
      const { code, data } = await databoard.getTable();
      if(code === 0){
         this.table = data
      }
    }
  }
}
<script>

结果:不报错,并且数据可以显示出来


❓ 问题一: 场景一中为什么报错,报错之后还可以正常显示数据 ?

答:首先是异步加载数据,异步显示数据,所以刚开始显示的是初始数据,等后台把数据传过来再显示后台传过来的数据。初始数据就是我们在data函数中赋值的数据,也就是{ }空对象;
简单模拟下显示的过程:首先页面刷新,dom树扫描显示数据,此时后台还没有把数据传过来,所以只能显示我们在data函数中赋值的初始值,table是空对象{ },table.content 为 undefined,执行table.content.name控制台报错,等后台数据返回回来,显示返回回来的数据,所以才出现控制台虽然报错,但可以正常显示

❓ 问题二: data函数定义的初始值table里面没有name这个属性,所以报错这点没问题,但是table里面也没有title这个属性为什么不报错 ?

答:对于table.title:table.title访问一个对象不存在的属性,值为undefined,放到页面还是空,所以就不报错了;
对于table.content.name:table.content访问一个对象不存在的属性,值为undefined,再往下访问就是undefined.name肯定会报错了。

也就是说我这里有一个对象table为{ },{{ table.name }} 是不会报错的,但是 {{ table.name.id }} 就会报错,结果值是undefined,放页面时不报错

三、解决

加上 v-if 先判断下是否有数据,有数据了再渲染模板。
注意:不能用 v-show 代替,v-show的原理是 display:none,其实模板已经渲染了只是 display:none了

 <template>
   <div v-if="table.content">单位:{{table.content.name}}</div>
 <template>

🍓小插曲

  <ul>
    <li class="clearfix" v-for="item in barData" :key="item.id">
      <span>{{item.id}}</span>
    </li>
  </ul>

结果: 初始值barData设置{ }或者undefined 是不会报错的,没有就不循环了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值