pcty_kk
一颗霸气的小虎牙
采纳率33.3%
2020-07-03 22:11

VUE TypeError: Cannot read property 'site' of undefined

20

# 在把后台返回的数据传入data中声明的数组中时,页面提示出: TypeError: Cannot read property 'site' of undefined

问题一:我在data中已经声明了这个属性,但是报错为undefined
问题二:打印data中的数组,却可以打印出来后台传入的数据

以下为问题代码:

//html

<svg class="bodymap">
          <path
            v-for="item in bodysites"
            :key="item.id"
            :id="item.id"
            :d="item.d"
            stroke="#4898ff"
            stroke-width="1px"
            :opacity="item.opacity"
            :transform="item.transform"
            :fill="item.fill"
            @mouseenter="svgenter(item.id)"
            @mouseout="svgout(item.id)"
          ></path>
</svg>
//data(其中一部分,太长了)

data() {
      return {
        buf_opacity: '0',
        site_sum: '0',
        sample_sum: '0',
        bodysites: [
          {
            id: '0',
            site: 'Ear',
            d: "M332.333,237.057c0,0,2.668-2.167,6.334,0s3.666,16.407-6.334,19.204S332.333,237.057,332.333,237.057zM260.667,237.39c0,0-0.333-1.167-3.5-1s-5.5,3.333-5.5,6.333s3.5,12.5,9,13.5S260.667,237.39,260.667,237.39z",
            fill: '#589fff',
            transform: 'translate(-162 -180)'
          },
          {
            id: '1',
            site: 'Nose',
            d: "M296.333,241.557c0,0-4.084,12.917-2.417,15.583s5.25,0,5.25,0S298.834,244.973,296.333,241.557z",
            fill: '#589fff',
            transform: 'translate(-162 -180)'
          }]
created() {
      this.getBodysites()
    },
    methods: {
      getBodysites() {
        this.$axios
          .get('test')
          .then(res => {
            // console.log(res.data.bodysites[0].site)
            // console.log(this.bodysites)
            for (var i = 0; i < res.data.bodysites.length; i++) {
              for (var j = 0; j < res.data.bodysites.length; j++) {
                if (this.bodysites[i].site === res.data.bodysites[j].site) {//报错问题出在这一行
                  this.bodysites[i].opacity = (res.data.bodysites[j].normal / res.data.sample_sum) * 5
                  this.bodysites[i].normal = res.data.bodysites[j].normal
                  this.bodysites[i].abnormal = res.data.bodysites[j].abnormal
                  this.bodysites[i].titletip = res.data.bodysites[j].site
                }
              }
            }
            this.sample_sum = res.data.sample_sum
            this.site_sum = res.data.site_sum
          })
          .catch(error => {
            console.log(error)
          })
      }
        }

报错信息如下:
图片说明

感觉可能和生命周期有关?

请各位大佬们帮忙看看问题在哪?应该怎么解决?(如果需要其他信息的话请留言!)

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • kingwolf_JavaScript 浴火_凤凰 10月前

    this.bodysites在楼主的截图里只有2个对象。
    res.data.bodysites不清楚有几个?
    不过如果res.data.bodysites的元素个数超过2个 那就肯定会报错了。
    if (this.bodysites[i].site === res.data.bodysites[j].site)
    这里的代码i的值只能是0 1 j大于2就会报错
    后来考虑到楼主的截图可能不完整。
    所以我又写了下面的代码
    双层循环的代码改为:

                for (var i = 0; i < this.bodysites.length; i++) {
                  for (var j = 0; j < res.data.bodysites.length; j++) {
                    if (this.bodysites[i].site === res.data.bodysites[j].site) {//报错问题出在这一行
                      this.bodysites[i].opacity = (res.data.bodysites[j].normal / res.data.sample_sum) * 5
                      this.bodysites[i].normal = res.data.bodysites[j].normal
                      this.bodysites[i].abnormal = res.data.bodysites[j].abnormal
                      this.bodysites[i].titletip = res.data.bodysites[j].site
                    }
                  }
                                }
    

    上面的代码应该可以了

    造成错误的原因 是data里的bodysites跟返回的bodysites个数不一样
    
    点赞 1 评论 复制链接分享
  • qq_36022290 zhenyu-s5 10月前

    循环那一块儿写错了,循环a对象数组就用a的长度,循环b的就用b的长度,别弄混淆了,
    你可以在第二个循坏里打印一下所有的值就可以发现会有某几项是undefined,

    点赞 2 评论 复制链接分享

相关推荐