为什么未加载此chartjs图形?(使用Vue.js)

nnsrf1az  于 2022-11-06  发布在  Chart.js
关注(0)|答案(1)|浏览(233)

这是我的chartjs组件,我试图从后端传递两个数组。不知何故,Vue.js在Vue中获得了数组,但它没有显示任何内容。我对Vue非常陌生,请耐心等待。
Chartjs.vue

<template>
  <div class="main-content">
    <div class="page-header">
      <h3 class="page-title">Chart JS</h3>
      <ol class="breadcrumb">
        <li class="breadcrumb-item"><a href="#">Home</a></li>
        <li class="breadcrumb-item"><a href="#">Charts</a></li>
        <li class="breadcrumb-item active">Chart JS</li>
      </ol>
    </div>
    <div class="row">
      <div class="col-sm-12">
        <div class="card">
          <div class="card-header">
            <h6>Chartjs</h6>
          </div>
          <div class="card-body">
            <div class="mb-4">
              <h5 class="section-semi-title">
                Line Chart
              </h5>
              <line-chart
                :labels='["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]'
                :values='values'
              />
            </div>
            <div class="mb-4">
              <h5 class="section-semi-title">
                Bar Chart
              </h5>
              <bar-line-chart
                :labels='["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]'
                :values='values'
                :valuesline='valuesline'
              />
            </div>

          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script type="text/babel">
import LineChart from '../../../components/chartjs/LineChart.vue'
import BarChart from '../../../components/chartjs/BarChart.vue'
import BarLineChart from '../../../components/chartjs/BarLineChart.vue'
import PieChart from '../../../components/chartjs/PieChart.vue'
import DoughnutChart from '../../../components/chartjs/DoughnutGraph.vue'

export default {
  components: {
    LineChart,
    BarChart,
    BarLineChart,
    PieChart,
    DoughnutChart,
    values:[],
    valuesline:[]
  },
  methods: {
    async fetchBarChartData ({ anio, sort }) {
      await axios.get(`/api/ingresos-por-mes/${anio}`).then(res=>{
        this.values=res.data.qty;
        this.valuesline=res.data.perc;
       });
    }
  },
  mounted() {
      this.fetchBarChartData({anio:2018});
  },
  data () {
    return {
      pieAndDoughtnut: {
        labels: ['Red', 'Blue', 'Yellow'],
        data: [300, 50, 100],
        bgColors: [
          '#FF6384',
          '#36A2EB',
          '#FFCE56'
        ],
        hoverBgColors: [
          '#FF6384',
          '#36A2EB',
          '#FFCE56'
        ]
      },
      values: this.values,
      valuesline: this.valuesline
    }
  }
}
</script>

BarLineChart.vue

<template>
  <div class="graph-container">
    <canvas id="graph" ref="graph"/>
  </div>
</template>

<script>
import Chart from 'chart.js'

export default {
  props: {
    labels: {
      type: Array,
      require: true,
      default: Array
    },
    values: {
      type: Array,
      require: true,
      default: Array
    },
    valuesline: {
      type: Array,
      require: true,
      default: Array
    }
  },

  mounted () {
    let context = this.$refs.graph.getContext('2d')
    let options = {
      responsive: true,
      maintainAspectRatio: false,
      legend: {
        display: false
      }
    }

    let data = {
      labels: this.labels,
      datasets: [
        {
          label: 'My First dataset',
          backgroundColor: 'rgba(79, 196, 127,0.2)',
          borderColor: 'rgba(79, 196, 127,1)',
          borderWidth: 1,
          hoverBackgroundColor: 'rgba(79, 196, 127,0.4)',
          hoverBorderColor: 'rgba(79, 196, 127,1)',
          data: this.values
        },
        {
          label: 'My First dataset',
          data: this.valuesline,
          type: 'line'
        }
      ]
    }

    this.myBarChart = new Chart(context, {
      type: 'bar',
      data: data,
      options: options
    })
  },

  beforeDestroy () {
    this.myBarChart.destroy()
  }
}
</script>

<style scoped>
.graph-container {
  height: 300px;
}
</style>

奇怪的是,如果我错误地将参数传递给了较低的组件,例如:

<line-chart
                :labels='["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]'
                :values='values.data'
              />

将“.data”添加到值会中断该组件,但允许其他组件加载下面的图表。
有没有人在过去不得不处理这个问题?我用的是我在www.example.com上找到的一个 Jmeter 板laraspace.in,以防万一。
编辑:我已经把这个添加到代码框中,这样你就可以更容易地帮助我了。
https://codesandbox.io/embed/vue-template-x4z7b
编辑2:设法使它在沙箱中与本地值一起工作,但不知何故,当调用API时,它在本地不工作。

tvz2xvvm

tvz2xvvm1#

  • 我道歉:vuews关于如何获取异步数据并将其集成到应用程序中的文档并不是最好的。我希望他们在这里能对最佳实践有更多的见解,并提供更多的示例。*

你的问题:依赖于异步数据的组件

当您进行异步api调用时,this.values是一个空数组(在api调用响应之前,this.values.data并不存在)。在数据返回之前,vue创建子组件,该子组件使用空值数组在其中创建一个图表,结果是一个空白图表。您必须等到数据加载后才能创建子组件(以及图表)。那么我们该如何做呢?

解决方案:条件组件呈现

1.提取已创建挂接中的数据,而不是已装载挂接中的数据。* 原因:较早请求数据的性能更高,请参阅:https://v2.vuejs.org/v2/guide/instance.html * 的最大值
1.在数据响应时,将该数据保存到您的vue组件中。* 原因:您需要该数据,请参阅:https://v2.vuejs.org/v2/cookbook/using-axios-to-consume-apis.html#ad*
1.保存时,使用变量this.loaded = true向html发出数据已准备就绪的信号,并在依赖于该数据的任何子组件上使用v-if="loaded",请参见:https://v2.vuejs.org/v2/guide/conditional.html
下面是一个工作代码沙箱,其中包含一个复制更改的虚拟API调用:https://codesandbox.io/s/vue-template-4b3lm
对Chartjs.vue文件进行了所有更改。

我看到您犯的其他一些错误:

  • 在component节中声明变量
  • 在太多地方设置这个.values太多次了。只要在数据中声明一次,以后再根据需要设置。

您可以使用其他方法解决此问题:

  • 在子组件中使用监视器,而不是v-if:当数据进入时(任何时候属性改变),重新呈现组件内的图表(而不是用v-if延迟整个组件)。
  • 使用vuex

相关问题