1.起源
最近我在学习如何封装echarts组件,我所参考的其中一篇博客中提到了一个“图表无法显示的问题”。
根据其中的介绍,造成此种问题的原因是因为,使用ref接受了echarts实例,使得echarts实例被代理为了响应式对象,进而影响了echarts对内部属性的访问。
2.实验
但遗憾的是,在封装和使用echats的过程中我还没有遇到过类似的问题,因此也无从判断问题的真假 ┓( ´∀` )┏
不过既然如此那我们真不妨来实验一下,在官方的Issue中,有贴出一些相关的问题情境,我选了其中的一个进行测试:
于是我准备了如下的一个带有tooltip
提示框的折线堆叠图的配置项,将其传入我刚刚封装的echarts组件中。
const option = ref({title: {text: 'Stacked Line',},tooltip: {trigger: 'axis',},legend: {data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine'],},grid: {left: '3%',right: '4%',bottom: '3%',containLabel: true,},toolbox: {feature: {saveAsImage: {},},},xAxis: {type: 'category',boundaryGap: false,data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],},yAxis: {type: 'value',},series: [{name: 'Email',type: 'line',stack: 'Total',data: [120, 132, 101, 134, 90, 230, 210],},{name: 'Union Ads',type: 'line',stack: 'Total',data: [220, 182, 191, 234, 290, 330, 310],},{name: 'Video Ads',type: 'line',stack: 'Total',data: [150, 232, 201, 154, 190, 330, 410],},{name: 'Direct',type: 'line',stack: 'Total',data: [320, 332, 301, 334, 390, 330, 320],},{name: 'Search Engine',type: 'line',stack: 'Total',data: [820, 932, 901, 934, 1290, 1330, 1320],},],
})
同时echarts实例依旧使用ref
来进行接收
const instance = ref(null)
从下图中可以看到,当鼠标hover到图上时提示框真的没有出现
之后我用浅层式APIshallowRef
代替原来的ref
接收echarts实例。
const instance = shallowRef(null)
这样提示框就可以正常出现了
3.结论
基于我所看到的官方资料和我实验的结果,可以得出结论:当我们在Vue中将echarts实例代理为响应式对象时,可能会造成一系列的意外问题。
解决方法是(在Vue3中),避免使用ref
、reactive
接收echarts实例,应该使用普通变量,或者使用shallowRef
、shallowReactive
、markRaw
等API。
参考资料
Vue3 封装 ECharts 通用组件_vue3如何封装echarts-CSDN博客
FAQ - Apache ECharts
响应式API: 进阶 | Vue.js
[Bug] Vue3 support seems not to behave correctly · Issue #17723 · apache/echarts