錯誤場景:
在 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 }
