Vue Bar柱状图数据更新后图表不刷新怎么办?
用Vue写了一个Bar柱状图组件,数据从接口拿回来后初始化正常,但切换筛选条件后数据更新了图表却不刷新,尝试过this.$forceUpdate()也没用,求解!
代码结构大概是这样的:
export default {
props: ['chartData'],
watch: {
chartData: {
handler() {
this.initChart()
},
deep: true
}
},
methods: {
initChart() {
const chart = this.$echarts.init(this.$refs.chart)
chart.setOption({
xAxis: { data: this.chartData.categories },
series: [{ data: this.chartData.values }]
})
}
}
}
控制台没报错,但新数据传进来后柱子完全没变化,得手动刷新页面才能显示最新数据,搞不懂为啥...
initChart方法,在初始化前先dispose旧实例:另外在组件销毁时记得释放资源:
这样改完应该就没问题了,检查一下。
initChart都重新调用this.$echarts.init创建了一个新的图表实例,但其实这样会导致性能问题,而且有时候新实例的渲染会有点问题。正确的做法是,在组件挂载的时候初始化一次 ECharts 实例,然后在数据变化时调用
chart.setOption来更新图表,而不是每次都重新初始化。把你的代码调整一下:关键点有几个:
1. 把 ECharts 实例保存到
data里,只在mounted的时候初始化一次。2. 数据变化时调用
updateChart方法,直接通过setOption更新数据。3. 在组件销毁前记得调用
dispose释放资源,不然可能会有内存泄漏的风险。另外提一句,
deep: true的确能监听到对象内部的变化,但如果你传入的chartData是一个全新的对象而不是内部属性变化,其实也可以不用deep监听,普通的handler就够了。别走弯路,按这个方式改,应该就能解决问题了。