博客 / 詳情

返回

[highcharts] 07_在highcharts渲染完成後結束loading

vue2項目 highcharts實例,如何在highcharts渲染開始時加載loading,在渲染結束時結束loading?

好久沒寫highcharts,最近有個同事寫highcharts時遇到了一個問題。

該業務場景的數據處理非常複雜,且存在某些個特定id的情況下,數據量極大,導致頁面上的highcharts卡頓(具體表現是:點了切換之後,有一段時間沒反應,之後highcharts重新渲染數據)
這中間"沒有反應"的一段時間,用户會懷疑自己到底有沒有成功實現切換行為。

這種場景下,既然數據的處理時長無法避免,就應該考慮給highcharts加個loading了。
一個理想狀態的實現是數據開始處理時loading,highcharts渲染完成之後取消loading

那我們就在引起數據變更的點擊事件內加入一個狀態變更,使內容區loading,這一步不難實現。問題是,如何在highcharts渲染完成之後取消loading呢?

Highcharts的事件中,有一個render事件,它在圖表渲染完成時觸發。監聽這個事件,在渲染卡頓的這個highcharts實例的render事件觸發時取消loading,就可以實現需求。下面看代碼實現。

image.png

chartInstance是highcharts的實例。

Highcharts.addEvent(chartInstance.chart,"render",this.cancelLoading); 這裏就是監聽的實現
其中cancelLoading定義在vue2的methods中
最後用$once語法在vue實例beforeDestroy的生命週期鈎子中取消監聽。

補充:
如果chartInstance獲取不到,那麼應該考慮是否有v-if的存在導致highcharts實例還未渲染時就執行了highcharts實例的獲取操作。(若是這個原因導致的chartInstance獲取不到,就還得在這段代碼塊的外層加上this.$nextTick())

完結!

同步更新到自己的語雀:
https://www.yuque.com/dirackeeko/blog/es3bwisav204rxcg

user avatar nbidashuju 頭像 sunshine_591c4563d4a83 頭像 shen_5bbe318c912ed 頭像 _bleach 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.