0%

记一次 bug:Vue 中 echarts 等图表如何实现响应式更新?

前言

最近的项目使用了 vue-chartjs 图表和 echarts 图表。昨天联调接口发现接口返回数据后,图表没有根据数据更新。还是默认数据渲染的图表。

排查

确认了接口没问题和代码也没报错后。审查代码发现是图表的渲染是在 mounted 中执行的,而这个生命周期函数只执行一次,所以数据更新了,图表没有响应式更新也是正常的。本来还以为是要调用专门的 API 去刷新图表。

解决

经过网上查找资料发现,其实只要使用 watch 检测数据,然后当数据更新后调用图表的绘制方法就可以了。就这么简单。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 props: {
chartsData: {
type: Array,
required: true,
validator: function(value) {
return value.length > 0;
}
}
},
computed: {
counts() {
let count = [];
this.chartsData.forEach(item => {
count.push(item.allAmountTotalDay);
});
return count;
},
days() {
let day = [];
this.chartsData.forEach(item => {
day.push(item.day);
});
return day;
},
// all 计算属性的用途是将需要 watch 的两个属性合并到一起再进行监测
all() {
return { counts: this.counts, days: this.days };
}
},
watch: {
all(curVal) {
// 数据发生改变,便调用图表绘制方法传入最新数据绘制
this.drawLine(curVal.counts, curVal.days);
}
},
mounted() {
this.drawLine(this.counts, this.days);
},
methods: {
drawLine(counts, days) {}
}

总结

将绘制方法定义在 methods 中便于复用,首先第一次在 mounted 中调用。然后使用 watch 属性监测处理过后的 chartsData ,数据改变时调用绘制方法,传入最新数据绘制。🆗 了。