You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vue.js中从JSON获取数据并用于Chart.js构建图表

解决Vue-Chart.js结合Fetch数据构建柱状图的问题

你的核心问题是获取到数据后没有将数据同步到图表配置中,而且图表初始化时后端数据还未加载完成,导致图表显示为空。下面我会一步步帮你修正代码,实现你想要的多数据集柱状图效果:

问题分析

你的代码存在两个关键问题:

  • mounted钩子初始化图表时,orders数据还没通过fetch获取到,所以图表的labels和datasets都是空数组
  • 获取到orders数据后,没有将数据映射到图表的配置项中,图表无法感知数据变化

解决方案

我们需要把图表配置做成响应式数据,在拿到后端数据后,将数据映射到图表的labels和datasets,再触发图表更新。以下是完整的修正代码:

完整可运行代码

var orderChart = Vue.component('order-chart', {
  extends: VueChartJs.Bar,
  data: function () {
    return {
      orders: [],
      // 将图表配置设为响应式数据,方便数据更新时同步图表
      chartData: {
        labels: [],
        datasets: [
          { 
            label: 'cancelled', 
            backgroundColor: 'red', 
            data: [] 
          },
          { 
            label: 'reserved', 
            backgroundColor: 'blue', 
            data: [] 
          },
          { 
            label: 'delivered', 
            backgroundColor: 'green', 
            data: [] 
          }
        ]
      },
      chartOptions: {
        responsive: true,
        maintainAspectRatio: false,
        // 可选:添加图例、坐标轴配置,让图表更贴合需求
        scales: {
          y: {
            beginAtZero: true
          }
        }
      }
    }
  },
  created:function() {
    fetch('/receive/')
      .then(res => res.json())
      .then(res => {
        this.orders = res;
        // 数据获取成功后,映射数据到图表配置
        this.transformDataForChart();
        // 初始化图表
        this.renderChart(this.chartData, this.chartOptions);
      });
  },
  methods: {
    transformDataForChart() {
      // 提取orderdate作为图表的x轴标签
      this.chartData.labels = this.orders.map(item => item.orderdate);
      // 分别提取三个状态的数据,对应到数据集
      this.chartData.datasets[0].data = this.orders.map(item => item.cancelled);
      this.chartData.datasets[1].data = this.orders.map(item => item.reserved);
      this.chartData.datasets[2].data = this.orders.map(item => item.delivered);
    }
  },
  // 可选:如果后续数据会动态更新(比如定时刷新),监听orders变化自动更新图表
  watch: {
    orders: {
      deep: true,
      handler() {
        this.transformDataForChart();
        this.$data._chart.update();
      }
    }
  }
})

关键细节说明

  1. 响应式图表配置:把chartData和chartOptions放到data中,确保Vue能追踪到数据变化
  2. 数据映射封装:用transformDataForChart方法专门处理数据转换,逻辑更清晰,也方便后续维护
  3. 初始化时机调整:将renderChart放在fetch的回调里,确保只有拿到数据后才初始化图表,避免空数据渲染
  4. 动态更新支持:添加watch监听orders的变化,如果后续数据会更新(比如定时拉取),图表会自动同步刷新

额外优化提示

如果你的orderdate是原始日期字符串,建议做格式化处理,让图表标签更易读:

// 在transformDataForChart方法中格式化日期
this.chartData.labels = this.orders.map(item => {
  return new Date(item.orderdate).toLocaleDateString('zh-CN');
});

内容的提问来源于stack exchange,提问作者VOV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:24:26