【问题标题】:How to update chart properties using the chart instance in vuejs + chartjs?如何使用 vuejs + chartjs 中的图表实例更新图表属性?
【发布时间】:2018-12-21 09:31:13
【问题描述】:

我正在关注 Alligator 的 tutorial,它解释了如何使用 vue js 和 chart js 创建基本的折线图。代码通过定义createChart vue 方法,导入图表配置planetChartData,然后在挂载vue 实例后调用该方法以创建图形实例。

然而,一旦初始图表被渲染到 html 画布元素,我有兴趣使用新数据点更新折线图。

根据图表jsdocs,可以使用以下函数更新图表。

function addData(chart, label, data) {
    chart.data.labels.push(label);
    chart.data.datasets.forEach((dataset) => {
        dataset.data.push(data);
    });
    chart.update();
}

我拿了这个函数,决定把它变成一个vue方法来更新图表。由于坐标数据存储在data 对象中,我可以像这样直接修改planetChartData,但我的问题是我不确定在数组更新后将什么作为chart 参数传递以重新呈现图表,因为 myChart 实例超出范围。我尝试在其他地方初始化myChart,但这总是会产生大量错误。

addAtempt(chart, label, data){
  this.lineChartData.data.labels.push('label')
  this.lineChartData.data.datasets.forEach(dataset => {
    dataset.data.push(data);
  });
  //issue is here
  chart.update()
}

下面是我完整的 vue 组件

 <template>
  <div>
      <h2>Fun Graph</h2>
      <canvas id="planet-chart"></canvas>
  </div>
</template>
<script>
import Chart from "chart.js";
import planetChartData from "./chart-data.js";

export default {
  name: "test",
  data() {
    return {
      text: "",
      planetChartData: planetChartData
    };
  },
  mounted() {
    this.createChart("planet-chart", this.planetChartData);
  },
  methods: {
    createChart(chartId, chartData) {
      const ctx = document.getElementById(chartId);
      const myChart = new Chart(ctx, {
        type: chartData.type,
        data: chartData.data,
        options: chartData.options
      });
    },
    addData(chart, label, data) {
      chart.data.labels.push(label);
      chart.data.datasets.forEach(dataset => {
        dataset.data.push(data);
      });
    }
  }
};
</script>

【问题讨论】:

  • 在挂载函数中创建图表的绝妙想法。我没有这样做,我是通过“观看”道具来创建图表,因此它无法正常工作,因为它正在抛出“myChart is null”。无论如何,很好的解决方案和很好的问题!

标签: javascript vue.js charts vuejs2


【解决方案1】:

您必须保存对图表实例的引用,即在您的createChart 方法中。

CodeSandbox 上的完整工作示例。

 <template>
  <div>
      <h2>Fun Graph</h2>
      <canvas id="planet-chart"></canvas>
  </div>
</template>
<script>
import Chart from "chart.js";
import planetChartData from "./chart-data.js";

export default {
  name: "test",
  data() {
    return {
      text: "",
      planetChartData: planetChartData,
      myChart: null,
    };
  },
  mounted() {
    this.createChart("planet-chart", this.planetChartData);
  },
  methods: {
    createChart(chartId, chartData) {
      const ctx = document.getElementById(chartId);
      // Save reference
      this.myChart = new Chart(ctx, {
        type: chartData.type,
        data: chartData.data,
        options: chartData.options
      });
    },
    addData(label, data) {
    // Use reference
      this.myChart.data.labels.push(label);
      this.myChart.data.datasets.forEach(dataset => {
        dataset.data.push(data);
      });
    }
  }
};
</script>

【讨论】:

  • 成功了!!!有没有办法让它动态化。例如,如果我再次使用 createChart() 方法创建另一个图表,我对图表 1 的原始引用将被覆盖,对吗?
  • 是的。我将创建一个键/值对象来保存对每个新图表的引用,就像现在 myChart 所做的那样,键是 id,值是实际实例。然后也许使用数组来创建新的画布。在这里查看CodeSandbox上的这个例子。
猜你喜欢
  • 2019-09-05
  • 1970-01-01
  • 2018-02-13
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
相关资源
最近更新 更多