我是vue的新手,说实话,我不明白如何从它的paren更新一个图形。使用vue-dev-tools,我看到数据得到了更新,但没有触发图形更新。我发现很多关于vue 2和旧版本vue-chartjs API调用的过时信息+vue-chartjs新api的文档,这对我没有帮助。vue-chartjs说有数据观察者。所以我假设,当我改变数据时,图表也会更新。但我在这里错过了一些东西。
Codesandbox:https://codesandbox.io/s/v8rdgz
我用的是vue 3
vue-chartjs@5.2.0
chart.js@4.3.0
我摆弄 prop ,计算,裁判,但我没有达到我的目标。这是我最小的例子。按下“更新图表”按钮时。应该会出现另一条线。
// LineChart.vue
<template>
<Line :data="data" :options="options" />
</template>
<script>
import { Line } from "vue-chartjs";
import {
Chart as ChartJS,
CategoryScale,
LinearScale,
PointElement,
LineElement,
Title,
Tooltip,
Legend,
} from "chart.js";
ChartJS.register(
CategoryScale,
LinearScale,
PointElement,
LineElement,
Title,
Tooltip,
Legend
);
export default {
components: { Line },
props: ["data", "options"],
};
</script>
// App.vue
<template>
<div>
<button @click="updateGraph">Update Graph</button>
</div>
<div>
<LineChart :data="chartData" :options="chartOptions" />
</div>
</template>
<script>
import LineChart from "./components/LineChart.vue";
export default {
data() {
return {
chartData: {
labels: [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
],
datasets: [
{
label: "Data One",
backgroundColor: "#f87979",
data: [40, 39, 10, 40, 39, 80, 40],
},
],
},
chartOptions: {
responsive: true,
maintainAspectRatio: false,
},
};
},
components: {
LineChart,
},
methods: {
updateGraph() {
this.chartData.datasets.push({
label: "Data Two",
backgroundColor: "#f87979",
data: [50, 59, 50, 50, 59, 50, 50],
});
},
},
};
</script>
感谢您的评分最好的问候
1条答案
按热度按时间qvk1mo1f1#
问题是你做的更新太深了。您需要用自身的更新版本替换
chartData
,而不是简单地更新其datasets
。chart.js
确实支持datasets
数组的变化,但是Vue不会深入地观察数据更新。因此,除非您替换this.chartData
,否则Vue不会更新Line.vue
,LineChart.vue
在内部使用。Working demo。
或者,您可以通过在
<LineChart />
组件上使用:key="chartData.datasets.length"
来告诉Vue何时需要重新渲染组件。但是,此方法从头开始重新呈现图表,因此您将获得初始数据动画,而不是从旧数据状态到新数据状态的动画。我推荐第一种方法。