我无法在图表中呈现数据。
WaveChart.js:
import { Line, mixins } from "vue-chartjs";
const { reactiveProp } = mixins;
import { mapGetters } from "vuex";
export default {
extends: Line,
mixins: [reactiveProp],
name: "WaveChart",
props: ["options", "chartData"],
computed: {
...mapGetters(["getZoom"])
},
mounted() {
this.renderChart(this.chartData, this.options);
},
methods: {
reRender() {
this.renderChart(this.chartData, this.options);
}
},
watch: {
options: {
deep: true,
handler: "reRender"
},
getZoom() {
this.reRender();
}
}
};
Wave.vue:
<template>
<WaveChart
id="line-chart"
:chartData="chartData"
:options="chartOptions"
:styles="waveChartStyle"
></WaveChart>
</template>
<script>
import WaveChart from "@/components/editorComponentsWidgets/chart/WaveChart";
import { broadcasterHubProxy } from "@/services/signalr_connection";
export default {
name: "Wave",
components: {
WaveChart
},
computed: {
...mapGetters(["getShouldFetch", "getZoom"]),
renderChartHeight() {
return (this.chartHeight * this.getZoom) / 100;
},
waveChartStyle() {
return {
height: `${this.renderChartHeight}px`,
width: "inherit",
position: "relative"
};
},
chartOptions() {
return {
lineWidth: 1,
elements: {
point: {
radius: 0
}
},
plugins: {
datalabels: {
display: false
},
filler: {
propagate: true
}
},
scales: {
xAxes: [
{
ticks: {
display: true
},
gridLines: {
color: "rgba(0, 0, 0, 0)"
}
}
],
yAxes: [
{
stacked: true,
ticks: {
callback: function(value) {
return value + "%";
},
min: this.minX,
max: this.maxX,
fontColor: this.labelColor,
fontSize: this.labelFontSize
},
gridLines: {
color: "rgba(0, 0, 0, 0)"
}
}
]
},
legend: { display: false },
tooltips: {
enabled: false
},
reactive: true,
responsive: true,
maintainAspectRatio: false
};
}
},
data() {
return {
render: true,
chartData: {
type: "line",
labels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],
datasets: [
{
label: "",
backgroundColor: "",
borderColor: "",
data: []
}
]
}
};
},
}
这是创建chartData对象的函数:
updateWave(wave) {
if (!wave) return;
this.chartData.datasets.length = 0;
wave.Categories.forEach(element => {
var datasets = {
label: element.Name,
backgroundColor: `rgba(${element.R}, ${element.G}, ${element.B}, 1)`,
borderColor: `rgba(${element.R}, ${element.G}, ${element.B}, 1)`,
data: element.Values
};
this.chartData.datasets.push(datasets);
});
}
[当我使用Vue devtools查看WaveChart.js中的道具时,我似乎拥有所需的一切:
chartData:Object
datasets:Array[12]
0:Object
backgroundColor:"rgba(0, 64, 128, 1)"
borderColor:"rgba(0, 64, 128, 1)"
data:Array[10]
label:"Broken Edge"
1:Object
2:Object
3:Object
4:Object
5:Object
6:Object
7:Object
8:Object
9:Object
10:Object
11:Object
labels:Array[10]
type:"line"
chartId:"line-chart"
cssClasses:""
height:400
options:Object
plugins:Array[0]
styles:Object
height:"282.6666666666667px"
position:"relative"
width:"inherit"
width:400
我真的不明白为什么看不到数据集。 Vue 2.6.11,chart.js 2.8.0,vue-chartjs 3.5.0。
更新:我设法使用异步updateWave呈现了数据集,并在数据中添加了加载的值。不幸的是,当我收到新的dto时,它没有重新渲染。
我通过在函数中添加异步和加载值来修复它:
Wave.vue:
<WaveChart
v-if="loaded"
id="line-chart"
:chartData="chartData"
:options="chartOptions"
:styles="waveChartStyle"
></WaveChart>
data() {
return {
loading: false
}
}
methods: {
async updateWave(wave) {
if (!wave) return;
this.chartData.datasets.length = 0;
try {
wave.Categories.forEach(element => {
var datasets = {
label: element.Name,
backgroundColor: `rgba(${element.R}, ${element.G}, ${
element.B
}, 1)`,
borderColor: `rgba(${element.R}, ${element.G}, ${element.B}, 1)`,
data: element.Values
};
this.chartData.datasets.push(datasets);
});
this.loaded = true;
} catch (e) {
console.error(e);
}
}
}
为了进行更新,我在WaveChart.js中添加了一个观察者:
watch: {
options: {
deep: true,
handler: "reRender"
},
chartData: {
deep: true,
handler: "reRender"
},
}