Echart餅形圖和折線圖的循環展示及選擇展示


需求:根據不同的入參調同一接口,循環展示一組餅形圖或折線圖;

主要問題:在於給定的數據格式不符合圖表的配置項格式,需要拆分組裝數據;首先默認展示幾個圖表,當選中一個類別,需要展示其中一個的時候,頁面中的Dom沒有清除,用了clear()無效,於是乎,就在頁面中做兩個div,一個用於展示選中的某一項,一個用於展示所有圖表。

 1 <div v-if="showPie1">
 2               <div id="chart-row" v-for="(item,index) in dataList" :key="index" style="display: flex;justify-content: center;margin-bottom: 40px;width: 80%;margin:0 auto;">
 3                 <div class="left-chart" :id="'left-chart-'+item.id" style="width:500px;height: 400px;margin-bottom:20px;padding-top:10px;border: 1px solid #f0f0f0;">
 4                   <img src="../../assets/timg.jpg" alt="暫無圖片" style="width:100px;height:100px;"></div>
 5               
 6               <div class="right-chart" :id="'right-chart-'+item.id" style="width:500px;height: 400px;margin-bottom:20px;padding-top:10px;border: 1px solid #f0f0f0;">
 7                 <img src="../../assets/timg.jpg" alt="暫無圖片" style="width:100px;height:100px;"></div>
 8             </div>
 9           </div>
10           <div id="pie" v-if="showPie2">
11             <div id="chart-row" v-for="(item,index) in itemList" :key="index" style="display: flex;justify-content: center;margin-bottom: 40px;width: 80%;margin:0 auto;">
12                 <div class="left-chart" :id="'left-chart-'+item.id" style="width:500px;height: 400px;margin-bottom:20px;padding-top:10px;border: 1px solid #f0f0f0;"><img src="../../assets/timg.jpg" alt="暫無圖片" style="width:100px;height:100px;"></div>
13               
14               <div class="right-chart" :id="'right-chart-'+item.id" style="width:500px;height: 400px;margin-bottom:20px;padding-top:10px;border: 1px solid #f0f0f0;"><img src="../../assets/timg.jpg" alt="暫無圖片" style="width:100px;height:100px;"></div>
15             </div>
16           </div>

id為chart-row的是選中某一項的dom,id為pie的是默認展示所有圖表的dom.

dom的id取名跟綁定圖表初始化的dom名一致,且命名是有規律的。

我這里是同時展示兩種類型的圖表,成功率和明細,使用axios.all()方法將數據同時請求回來,在請求接口時,使用ES7中的async異步執行,保證數據在.all方法中能夠全部獲取完。

 1 //獲取折線圖成功失敗率接口定義
 2   async getLeftLineData(list){
 3     var data = {}
 4     if(this.filters.invoice){
 5       data = { ticketType: this.filters.invoice}
 6     }else{
 7       data = { ticketType: list.id }
 8     }
 9     return this.$api.report.ocrMonthCount(data)
10   },

獲取到的數據在axios.all方法里做處理,其中optionList是存放循環入參信息的;

optionList: [
        //選擇
        { value: '', label: "請選擇"},
        { value: "001", label: "選擇一" },
        { value: "002", label: "選擇二" },
        { value: "003", label: "選擇三" },
      ],
 1 for(let i = 0; i < optionList.length; i++){
 2       axios.all([this.getLeftLineData(optionList[i]), this.getRightLineData(optionList[i])])
 3       .then(res=>{
 4         let leftData = res[0].data
 5         let rightData = res[1].data
 6         var xAxis = [];
 7         var failTotal = []
 8         var successTotal = []
 9         var successFailurArry = [1, 2]
10         for(var y = 0; y<successFailurArry.length; y++){
11       // 基於准備好的dom,初始化echarts實例,左側占比
12           var myChart = echarts.init(document.getElementById('left-line-'+optionList[i].id));
13         for (var j = 0; j < leftData.fail.length; j++) {
14           xAxis.push(leftData.fail[j].monthName);
15           failTotal.push(leftData.fail[j].monthTotal);
16         }
17         for (var k = 0; k < leftData.success.length; k++) {
18           successTotal.push(leftData.success[k].monthTotal);
19         }
20         // 繪制圖表
21         var seriesOption = {
22             //配置信息
23         }    
24          myChart.setOption(seriesOption, true);
25         }

有時,myChart.clear()無效,可以手動的將上一次定義的值清空。


免責聲明!

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



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