1. 程式人生 > >vue專案中使用echarts 遇到問題總結

vue專案中使用echarts 遇到問題總結

需要注意echarts版本不同,部分屬性可能有所不同,我用的是echarts4.0.

一、echarts圖表自適應問題。

自適應程式碼

(function (doc, win) {
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function () {
            var clientWidth = docEl.clientWidth;
            if (!clientWidth) return;
            if(clientWidth>=1366){
                 docEl.style.fontSize = 100 * (clientWidth / 1366) + 'px';
            }else{
                    docEl.style.fontSize = 100+"px"
            }
               
        };
    if (!doc.addEventListener) return;
    recalc();


    win.addEventListener(resizeEvt, recalc, false);
    doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

使用自適應rem 來畫echarts圖表。發現剛開始載入,canvas 的寬高始終是rem未實現之前元素的寬高,打斷點發現是載入順序原因(加上document.ready後發現部分還是有問題),換算rem之前就獲取了元素寬高,導致圖表很小,才發現自適應程式碼只有在瀏覽器視窗大小發生變化和dom結構載入完成後才會執行函式換算,所以沒發生之前就先呼叫recalc(); 

二、echarts圖表的迴圈問題

使用vue開發,其中需要用到圖表的迴圈,問題來了,echarts都是通過不同的id來初始化圖表的,而我用到了v-for ,一次迴圈中的兩個不同的圖表index相同,只能通過

動態設定id來實現了,但是id沒賦值之前echarts就初始化了,導致拿到的id 為undefined,所以寫了個定時器延遲呼叫,顯然此法並不好,但想不到更好的了,上程式碼;

  <li v-for="item in trastMsg">
             <div :id="item.sign"></div>
             <div :id="item.radarsign"></div>
  </li>

for(var i = 0;i<self.trastMsg.length;i++){
        self.trastMsg[i].sign = 'echart'+i;
        self.trastMsg[i].radarsign = 'echart'+10+i;
      }

 var timer = setInterval(quw,20);
       var t = 0;
       function quw(){
         for(var i = 0;i<self.trastMsg.length;i++){
            if(document.getElementById(self.trastMsg[i].sign)==null){
              t=1;
            }
         }
          if(t!=1){
              for(var i = 0;i<self.trastMsg.length;i++){
                function barQuest(){
                          let myChart = echarts.init(document.getElementById(self.trastMsg[i].sign));

}

             }

 clearInterval(timer);清除定時器

}

}

三、柱圖

1、柱圖資料條最大最小值標註不同於其他資料的顏色(js僅僅考慮到只有一個最大、最小值的情況)

var maxindex = value.indexOf(Math.max.apply(Math, value));

var minindex = value.indexOf(Math.min.apply(Math, value));

 option中

series:[{

itemStyle:{
normal: {
show: true,
color:function(params) {
var colorList = [];
for(var i = 0;i<name.length;i++){
colorList.push('#5CB5D6')
}
colorList[maxindex]='#EB6100';
colorList[minindex]='#22AC38';
return colorList[params.dataIndex]
         }

       }

}]

2、柱圖資料標籤僅顯示最大最小值,其他值滑鼠懸浮上去顯示

顯然label這並不能像color 一樣返回陣列,需要在data屬性上下功夫,所以data裡面就不能簡單存值,而是存在data["value":];

例:"data":[{"name":"張三","value":622}]

for(var i=0;i<data.length;i++){
data[i].label={show:false,position:'top'};
data[i].emphasis={label:{show:true,position:'top'}}
}

var maxindex = value.indexOf(Math.max.apply(Math, value));
var minindex = value.indexOf(Math.min.apply(Math, valuenull));
data[maxindex].label= {show:true,position:'top'};
data[minindex].label= {show:true,position:'top'};

四、雷達圖‘

1、圖例問題

vue-cli 構建的專案,雷達圖就是沒有圖例,相同程式碼放到html就可以,後來才發現是沒引用legend;

切記vue-cli中的title\legend等需要引入,’require('echarts/lib/component/legend');

除此之外,圖例的圖形在data的icon中設定了rect,原以為是正方形了結果,結果是矩形,也沒錯啦,所以還需要設定

color:["#5CB5D6","#32B16C","#EB6877","#F8B551"], 圖例顏色

legend: {
right:0,
top:'2%',
orient: 'vertical',圖例方向
data: [{name:'1',icon:'rect},{name:'2',icon:'rect'}],圖例形狀
itemWidth:12,圖例寬
itemHeight:12,圖例高
textStyle:{
color:'#707070'
}
},

另外資料的線顏色已經在data中設定,但圖例顏色卻不一致,在legend中也沒法設定,只能在legend同級color中把圖例顏色設定;

2、雷達圖資料標籤顯示

 series: [{
                      type: 'radar',
                      symbolSize:0,
                      label:{
                        show:true,
                        color:'#000000',
                        position:'top'
                      },

label就是顯示不出來,納悶,後來才發現只要   symbolSize:0,就顯示不出來,所以要不不加,要不改為  symbolSize:1,解決