错误场景:
在 vue 项目中使用了 echarts,在一个页签与另一个页签之间切换多次后,页面卡顿并且 echarts 不能重绘,出现白屏。
原因分析:
echarts 频繁初始化画图时候有内存泄漏,吃掉了所有内存,就白屏画不出来了。
生成的echarts实例对象很大,占用内存过多。 echarts 里 zrender 用的canvas。
解决方法:
-
不要把chart实例赋值在this上。(this对象一直存在不会被回收)
-
新版本echarts不支持对一个dom多次创建实例。
-
析构掉生成的echarts对象。
代码示例:
1 //-dom 不存在时不画 2 if (!this.$refs.barchart) { 3 return 4 } 5 //- 不要重复初始化 6 let Chart = echarts.getInstanceByDom(this.$refs.barchart) 7 if (!Chart) { 8 Chart = echarts.init(this.$refs.barchart, 'light') 9 } 10 //-释放echarts对象 11 beforeDestroy () { 12 let dcharts = echarts.getInstanceByDom(this.$refs.barchart) 13 if (dcharts) { 14 echarts.dispose(dcharts) 15 } 16 } 17 18 //- 发现官网实例上有once hook 比destroy 要好一些 19 //- hook:beforeDestroy 20 let Chart = echarts.getInstanceByDom(this.$refs.barchart) 21 if (!Chart) { 22 Chart = echarts.init(this.$refs.barchart, 'light') 23 this.$once('hook:beforeDestroy', () => { 24 echarts.dispose(Chart) 25 }) 26 }