Vue3 组件内使用echarts时出现重复挂载的问题

项目场景:

在Vue3中组件中使用了echarts进行曲线图展示,其中组件采用vue-class-component来声明。


问题描述

页面第一次进来能正常展示曲线,但当菜单第二次进入时,出现无法展示的问题,console报出There is a chart instance already initialized on the dom.的错误,其他两个菜单对应的页面中echarts也是相同的写法,但是重新进入页面并没有报错,百思不得其解。 

	export default class xxxxx  extends Vue {
        mounted() {
		   let myDom = document.getElementById("myEchart");
           let myEchart = echarts.init(myDom );
           let option = {
              xAxis: {
                type: "category",
                boundaryGap: false,
                data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
              },
              yAxis: {
                type: "value",
              },
              series: [
                {
                  data: [820, 932, 901, 934, 1290, 1330, 1320],
                  type: "line",
                  smooth: true,
                  areaStyle: {},
                },
              ],
           };
           myEchart.setOption(option );
	}

原因分析:

echarts在同一个ID上重复创建chart,导致报错。


解决方案

在初始化之前调用销毁接口:

	export default class xxxxx  extends Vue {
        mounted() {
		   let myDom = document.getElementById("myEchart");
           echarts.dispose(myDom);
           let myEchart = echarts.init(myDom );
           let option = {
              xAxis: {
                type: "category",
                boundaryGap: false,
                data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
              },
              yAxis: {
                type: "value",
              },
              series: [
                {
                  data: [820, 932, 901, 934, 1290, 1330, 1320],
                  type: "line",
                  smooth: true,
                  areaStyle: {},
                },
              ],
           };
           myEchart.setOption(option );
	}

后记 

 之前尝试在组件销毁时dispose这个echart,结果destroyed根本不生效,不知道vue-class-component的组件销毁钩子函数怎么定义。

还有网上的方案使用全局变量进行创建后的对象接收,在初始化之前先判断变量是否为空,不为空则dispose,最后init,感觉麻烦,没有尝试。


版权声明:本文为zb527129原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。