【问题标题】:Vue: Error in created hook: "TypeError: Cannot convert undefined or null to object"Vue:创建的钩子出错:“TypeError:无法将未定义或空值转换为对象”
【发布时间】:2018-06-23 19:06:09
【问题描述】:

所以当我尝试在浏览器中运行我的父组件“仪表板”时。子组件“ChartUsage”在我的控制台中引发错误:[Vue warn]: Error in created hook: "TypeError: Cannot convert undefined or null to object" 当我尝试调试时,我看到道具:userSubmitsProp,只返回一个空数组。所以这也很奇怪。但我不知道为什么。谁能帮我吗?

发送prop的父组件:userSubmitsProp:

<template>
  <div class="dashboard">
    <cards :userDataProp="currentUserData"/>
    <chartusage :userSubmitsProp="previousSubmits" />
  </div>
</template>

<script>
import db from '@/firebase/init'
import firebase from 'firebase'
import moment from 'moment'
import Chartusage from '@/components/dashboard/ChartUsage'
import Cards from '@/components/dashboard/Cards'

export default {
  name: 'Dashboard',
  components: {
    Chartusage,
    Cards
  },
  data () {
    return {
      currentUserData: {},
      previousSubmits: []
    }
  },
  created () {
    let user = firebase.auth().currentUser

    // find the user record
    db.collection('users').where('user_id', '==', user.uid).get()
      .then(snapshot => {
        snapshot.forEach((doc) => {
          let userData = doc.data()
          userData.timestamp = moment(doc.data().timestamp).format('lll')
          this.currentUserData = userData
        })
      })
      .then(() => {
        // fetch the user previous submits from the firestore
        db.collection('submits').where('user', '==', this.currentUserData.alias).get()
          .then(snapshot => {
            snapshot.forEach(doc => {
              let submit = doc.data()
              submit.id = doc.id
              submit.timestamp = moment(doc.data().timestamp).format('lll')
              this.previousSubmits.push(submit)

              // sort previousSubmits array by date
              this.previousSubmits.sort((a, b) => {
                a = new Date(a.timestamp)
                b = new Date(b.timestamp)
                return b - a
              })
              console.log(this.previousSubmits)
            })
          })
      })
  }
}
</script>

<style>
</style>

接收 userSubmitsProp 属性的子组件用它制作图表:

<template>
  <div class="check-usage">
    <div class="row">
      <div class="col s12">
        <div class="chart">
          <chartjs-line
            :fill="true"
            :datalabel="'My household usage'"
            :labels="labels"
            :data="dataset"
            :bordercolor="'#1976D2'"
            :backgroundcolor="'rgba(25,118,210, 0.5)'"
            :pointborderwidth="mywidth"
            :pointbordercolor="mypointbordercolor"
            :pointhoverborderwidth="hoverwidth"
            :pointhoverbackgroundcolor="hoverbackgroundcolor"
            :pointhoverbordercolor="hoverbordercolor"
            :bind="true">
          </chartjs-line>
          </div>
      </div>
  </div>
  </div>
</template>

<script>
export default {
  name: 'Chartusage',
  props: {
    userSubmitsProp: {
      type: Array,
      required: true
    }
  },
  data () {
    return {
      submits: this.userSubmitsProp,
      // chart data
      labels: [],
      dataset: [],
      // hover point
      mywidth: 3,
      mypointbordercolor: '#1976D2',
      hoverwidth: 3,
      hoverbackgroundcolor: '#636b6f',
      hoverbordercolor: '#ffd663'
    }
  },
  methods: {
    addChartLabels () {
      debugger
      for (let submit of Object.values(this.submits)) {
        this.labels.push(submit.timestamp)
      }
    },
    addChartdataset () {
      for (let submit of Object.values(this.usersubmits)) {
        this.dataset.push(submit.usage)
      }
    }
  },
  created () {
    this.addChartLabels()
    this.addChartdataset()
  }
}
</script>

<style>
.check-usage {
  margin: 20px 20px 30px 20px;
  box-shadow: 0 4px 70px -18px #707070;
  padding: 10px;
}

.chart {
  padding: 10px;
}
</style>

【问题讨论】:

    标签: vue.js vue-component


    【解决方案1】:

    所以 Dashboard 组件中的previousSubmits 是一个空数组:

    export default {
      name: 'Dashboard',
      data () {
        return {
          currentUserData: {},
          previousSubmits: []
        }
      },
    

    这就是作为userSubmitsProp 传递给chartusage 组件的内容:

        <chartusage :userSubmitsProp="previousSubmits" />
    

    在该子组件的数据中也被称为submits

      data () {
        return {
          submits: this.userSubmitsProp,
    

    然后你的代码尝试在一个空数组上调用Object.values

    Object.values(this.submits)
    

    顺便说一句,为组件提供属性的惯用方式是使用破折号而不是驼峰式:

        <chartusage :user-submits-prop="previousSubmits" />
    

    【讨论】:

    • 感谢您的回答斯蒂芬!但是在仪表板组件的创建周期中,previousSubmits 数组不是填充了 Firestore 数据吗?还是previousSubmits数组是在创建循环之前传给prop的,然后才被填充?谢谢你的提示。从现在开始,我将使用驼峰式作为属性:)
    • 不是在创建组件时。仅在 HTTP 请求承诺解决之后。
    • 我对此很陌生。我怎样才能解决这个问题?设置超时,以便有时间等待数据?
    • 我建议花一点时间学习一些网络上的 Vue 教程。您采用的整个方法似乎与典型的 Vue 开发相反。我认为如果你坚持更常见的架构,你可能会更成功。 Vue 官方网站上甚至还有几个示例(例如 vuejs.org/v2/examples/firebase.html)。
    • 感谢您的帮助!我会听从你的建议。
    猜你喜欢
    • 2020-08-04
    • 2020-06-09
    • 2021-01-20
    • 2020-03-21
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2020-12-22
    • 2020-04-13
    相关资源
    最近更新 更多