vue使用ECharts時的異步更新與數據加載


vue使用ECharts時的異步更新與數據加載

使用Echarts首先得先把Echarts.js引進來(放在文件的入口html文件里面)

 

<script src="public/js/echarts.common.min.js"></script>

 

在繪圖前我們需要為 ECharts 准備一個具備高寬的 DOM 容器

 

<div id="main" style="width: 600px;height:400px;"></div>

 

初始化一個 echarts 實例並通過 setOption 方法生成一個你想要的圖表類型,

首先先把,echarts里setOption的option,單獨領出來,初始化放在data里

data() { return { 

    

getSetOption: {//折線圖

                title: {

                    text: null

                },

                tooltip: {

                    trigger: 'axis'

                },

                grid: {

                    left: '3%',

                    right: '4%',

                    bottom: '3%',

                    containLabel: true

                },

                yAxis: {

                    type: 'value'

                },

                legend: {

                    data: []

                },

 

                xAxis: {

                    type: 'category',

                    data: []

                },

 

                series: [

                    {

                        name: null,

                        type: 'line',

                        stack: '總人數',

                        data: []

                    }

                ]

            },

 

            getPieOption: {//餅圖

                title: { 

                    text: null 

                },

 

                tooltip: {

                    tooltip: 'item',

                    formatter: "{a} <br/> {b} : {c} ({d}%)"

                },

                series : [

                    {

                        type: 'pie',

                        radius: '55%',

                        data:[

                        ].sort(function(a,b){return a.value - b.value;}),

                        roseType: 'angle',

                    }

                ]

            },

  }

}

 

 

 

下面是在methods里初始化的一個方法

 

drawLineChart() {

           this.lineChartOrder = echarts.init(document.getElementById('lineChartOrder'));

            this.lineChartOrder.setOption(this.getSetOption); 

        },

 

        然后在mounted里調用這個方法

 

        this.drawLineChart(),

 

        接下來就就是數據異步加載與更新了。

        以下的代碼是本地的json類型,異步加載數據時只要填入數據,然后在series里根據名字對應到相應的系列就可以了。

 

           getOrderTotal(){//獲取一段時間內的訂單統計

            api.getOrderStatistical(this.begin, this.end,this.kId)

            .then(res => {

                if (res.data.ok && res.data.r.length) {

 

                    const

                        results = res.data.r, 

                        legends = results.map(item => ({

                            name: item.channelName,

                            data: item.dateStatisticals

                        }))

                    

                    this.lineChartOrder.setOption({

                        title: {

                            text: '訂單統計'

                        },

                        legend: {

                            data: legends.map(item => item.name)

                        },

 

                        xAxis: {

                            data: legends[0].data.map(item => item.date)

                        },

 

                        series: legends.map(item => {

                            return {

                                type: 'line',

                                name: item.name,

                                data: item.data.map(item => item.count)

                            }

                        })

                    })

                }

            }).catch(err => {

                // console.log(err)

            })

但是,echarts的數據是直接merge的,所以當出現多條折線時,如果當天的數據為0,或者后台傳過來的數據為空的時候,setOption的值根本就沒有更新,而是直接merge了,所以這個問題就頭大了。

對於這個問題的解決方法是

     用getOption取到已經存在的option, 然后用this.lineChartOrder.setOption.clear(),清空option,最后this.lineChartOrder.setOption(option, false, false)。

這樣就可以清掉了。

 

            以下是官網異步數據加載與更新的方法,會相對簡單些。

 

            // 異步加載數據

 $.get('data.json').done(function (data) {

// 填入數據

 

myChart.setOption({

 

    xAxis: {

        data: data.categories

    },

    series: [{

        // 根據名字對應到相應的系列

        name: '銷量',

        data: data.data

    }]

});

 

只需要將數據填充進入就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM