Chart.js线型图大部分时间不显示

问题描述 投票:0回答:1

我想在图表上显示捐款和捐款日期。神秘的是,图表有时会显示出来(约5%的时间),但其他95%的时间却没有显示出来(见底部图片)。

我对我遇到的这个问题非常困惑。我想使用我从一个API获得的一些数据创建一个线图。我正在使用 chart.js。有时它显示出来,有时不显示。这与获取API数据没有任何关系,因为(从控制台看)这是在立即完成的。所以我肯定是我使用chart.js的方式有问题。

这是我的LineChart.vue。

<script>
import { Line } from 'vue-chartjs'

export default {
  name: 'LineChart',
  extends: Line,
  props: {
    label: {
      type: String
    },
    chartData: {
      type: Array
    },
    options: {
      type: Object
    }
  },
  mounted () {
    const dates = this.chartData.map(d => d.donationDate).reverse()
    const totals = this.chartData.map(d => d.totalMoney).reverse()

    this.renderChart({
      labels: dates,
      datasets: [{
        label: this.label,
        data: totals
      }]
    },
    this.options)
  }
}
</script>

这是我的Fundraiser. vue的代码:

<template>
  <div class="container">
    <div class="row mt-5">
      <div class="col">
        <h2>Positive</h2>
        <line-chart :chart-data=recentDonations :options=chartOptions label='Positive'>
        </line-chart>
      </div>
    </div>
  </div>
</template>

<script>
import axios from 'axios'
import moment from 'moment'
import LineChart from '../components/LineChart.vue'

export default {
  name: 'Fundraiser',
  components: { LineChart },
  data () {
    return {
      recentDonations: [],
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false
      }
    }
  },
  async created () {
    const { data } = await axios({
      url: 'http://api.justgiving.com/[MY API KEY]/v1/crowdfunding/pages/[SOME-PAGE]/pledges',
      method: 'get',
      headers: {
        Accept: 'application/json'
      }
    })
    console.log(data)
    data.pledges.forEach(d => { // this part works fine.
      if (d.donationAmount != null) {
        const dateInEpochFormat = d.activityDate.substring(6, 16)
        const donationMade = moment.unix(dateInEpochFormat).format('MM/DD')
        this.recentDonations.push({ donationDate: donationMade, totalMoney: d.donationAmount })
      }
      console.log(this.recentDonations)
    })
  }
}
</script>

正如你从下面的图片中看到的那样,数据被拉得很好(有两个属性的对象数组:donateDate和totalMoney)。

enter image description here

所以有时会出现(非常非常少):[。enter image description here][

然后我刷新页面(不碰任何代码),突然。enter image description here

谁能帮我解开这个谜团?

javascript vue.js chart.js vuetify.js vue-chartjs
1个回答
1
投票

试着在收到http请求的响应后渲染图表,也许用一个 if 语句和一个变量作为 flag:

<template>
  <div class="container">
    <div class="row mt-5">
      <div class="col" v-if="show">
        <h2>Positive</h2>
        <line-chart
          :chart-data="recentDonations"
          :options="chartOptions"
          label="Positive"
        >
        </line-chart>
      </div>
    </div>
  </div>
</template>

在你的 export default 对象,你可以有这样的功能。

export default {
  name: 'Fundraiser',
  components: { LineChart },
  data () {
    return {
      show: false,
      recentDonations: [],
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false
      }
    }
  },
  async created () {
    const { data } = await axios({
      url: 'http://api.justgiving.com/[MY API KEY]/v1/crowdfunding/pages/[SOME- 
      PAGE]/pledges',
      method: 'get',
      headers: {
        Accept: 'application/json'
      }
    })
    console.log(data)
    data.pledges.forEach(d => { // this part works fine.
      if (d.donationAmount != null) {
        const dateInEpochFormat = d.activityDate.substring(6, 16)
        const donationMade = moment.unix(dateInEpochFormat).format('MM/DD')
        this.recentDonations.push({ donationDate: donationMade, totalMoney: 
        d.donationAmount })
      }
      console.log(this.recentDonations)
    })
    this.show = true;
  }
}

这是一个变通的方法,你是在等待有了数据之后再渲染图形, 这样在第一次渲染图形的时候,它就可以使用数据并显示信息。

在图形中看不到数据的原因是当图形被渲染时没有信息可显示,一旦你得到http请求的响应,图形就不会被更新,要做到这一点,你必须观察chartData道具,一旦chartData被更新,你必须调用chart.js update graph方法(你可以在这里阅读更多信息。https:/www.chartjs.orgdocslatestdevelopersupdates.html)

处理数据更新的一个更好的方法是将值分配给 this.recentDonations if (d.donationAmount != null) { const dateInEpochFormat = d.activityDate.substring(6, 16) const donationMade = moment.unix(dateInEpochFormat).format('MMDD') donations.push({ donationDate: donationMade, totalMoney). substring(6, 16) const donationMade = moment.unix(dateInEpochFormat).format('MMDD') donations.push({ donationDate: donationMade, totalMoney: d.donationAmount }) } console.log(this.recentDonations) }) this.recentDonation = donations; this.show = true; ...

我用这段代码做了一个超时函数的测试(我不知道如何使用justgiving api)。

<template>
  <div class="container">
    <div class="row mt-5">
      <div class="col" v-if="show">
        <h2>Positive</h2>
        <line-chart
          :chart-data="recentDonations"
          :options="chartOptions"
          label="Positive"
        >
        </line-chart>
      </div>
    </div>
  </div>
</template>

<script>
import axios from "axios";
import moment from "moment";
import LineChart from "../components/LineChart.vue";

export default {
  name: "Fundraiser",
  components: { LineChart },
  data() {
    return {
      show: false,
      recentDonations: [],
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false
      }
    };
  },
  methods: {
    request() {
      const pledges = [
        { donationDate: "11/08", donationAmount: 5 },
        { donationDate: "11/09", donationAmount: 5 },
        { donationDate: "11/10", donationAmount: 5 },
        { donationDate: "11/11", donationAmount: 5 },
        { donationDate: "11/12", donationAmount: 5 },
        { donationDate: "11/13", donationAmount: 5 },
        { donationDate: "11/14", donationAmount: 5 },
        { donationDate: "11/15", donationAmount: 5 },
        { donationDate: "11/16", donationAmount: 5 },
        { donationDate: "11/17", donationAmount: 5 },
        { donationDate: "11/18", donationAmount: 5 },
        { donationDate: "11/19", donationAmount: 5 },
        { donationDate: "11/20", donationAmount: 5 },
        { donationDate: "11/21", donationAmount: 5 },
        { donationDate: "11/22", donationAmount: 5 }
      ];
      pledges.forEach(d => {
        // this part works fine.
        // if (d.donationAmount != null) {
        // const dateInEpochFormat = d.activityDate.substring(6, 16);
        // const donationMade = moment.unix(dateInEpochFormat).format("MM/DD");
        this.recentDonations.push({
          donationDate: d.donationDate,
          totalMoney: d.donationAmount
        });
        // }
        console.log(this.recentDonations);
      });
      this.show = true;
    }
  },
  async created() {
    await setTimeout(this.request, 1000);
  }
};
</script>

如果你去掉if语句,图表就不会显示任何数据了

© www.soinside.com 2019 - 2024. All rights reserved.