使用 Vue Chart js 计算属性时出现无限循环
2019-05-13
1941
我尝试每 5 秒使用来自 API 调用的新数据更新一次图表。我的图表正在更新,但每个点都要渲染数百次。我检查了日志,它显示有一个无限循环正在发生,我不确定如何解决这个问题。下面是我当前的代码:
注意:“graphData”prop 是我从 Parent 传递的一个数组,它是来自 API 调用的数据,我想将其添加到图表中
ChildComponent.vue
<template>
<div class="graphCard">
<Linechart :chartData="dataCollection" :options="options" />
</div>
</template>
<script>
import Linechart from '@/utils/Linechart.js'
export default {
components: {
Linechart
},
props: ['graphData'],
data() {
return {
collection: []
}
},
computed: {
dataCollection() {
this.collection.push(this.graphData[0])
return {
datasets: [
{
label: 'chart',
backgroundColor: 'indigo',
borderColor: 'indigo',
fill:false,
showLine: true,
data: this.collection
}]
}
},
options() {
return {
id: 'Cumulative',
legend: {
display: false
},
scales: {
xAxes: [{
type: 'time',
distribution: 'series',
time: {
displayFormats: {
millisecond: 'mm:ss:SS',
quarter: 'MMM YYYY'
}
}
}],
yAxes: [{
ticks: {
//beginAtZero: true
}
}]
}
}
}
LineChart.js
import { Scatter, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins
export default {
extends: Scatter,
mixins: [reactiveProp],
props: ['chartData', 'options'],
mounted () {
this.renderChart(this.chartData, this.options)
}
}
在另一种方法中,我还尝试将 dataCollection 和选项设置为“data”而不是“computed”,并在 graphData prop 上设置一个观察器,但图表没有更新并遇到了问题“Uncaught TypeError:无法读取未定义的属性‘skip’”
2个回答
通常情况下,
computed
比
watcher
更好,但我不确定在没有更多上下文的情况下是否可以调试这个无限循环。
因此,这里是
data
+
watch
替代方案,应该可以工作。
代码:
<template>
<div class="graphCard">
<Linechart :chartData="dataCollection" :options="options" v-if="dataCollection.datasets[0].data.length"/>
</div>
</template>
<script>
import Linechart from '@/utils/Linechart.js'
export default {
components: {
Linechart
},
props: ['graphData'],
data() {
return {
dataCollection: {
datasets: [{
label: 'chart',
backgroundColor: 'indigo',
borderColor: 'indigo',
fill:false,
showLine: true,
data: []
}]
},
options: {
id: 'Cumulative',
legend: {
display: false
},
scales: {
xAxes: [{
type: 'time',
distribution: 'series',
time: {
displayFormats: {
millisecond: 'mm:ss:SS',
quarter: 'MMM YYYY'
}
}
}],
yAxes: [{
ticks: {
//beginAtZero: true
}
}]
}
}
}
},
watch: {
graphData (newData) {
this.dataCollection.datasets[0].data.push(newData[0])
}
}
}
BTL
2019-05-13
@BTL 的方法让我走上了正确的轨道,但一些问题仍然阻碍了图表的正确更新。如果将新数据直接推送到数据集上,chartData 似乎无法正确更新。对我有用的方法:
watch: {
graphData (newData) {
currentDataList.push(newData[0])
this.dataCollection = {
datasets: [{
label: 'label',
backgroundColor:'red',
borderColor: 'red',
fill:false,
showLine: true,
lineTension: 0,
data: currentDataList
}]
}
}
}
Ph33ly
2019-05-16