Vue封裝echarts組件

1蚪拦、最近做的項目是后臺管理系統(tǒng)弃榨,里面含有各種的echarts的圖標箍铲,一般的圖表都是比較好繪制的雇卷,稍微比較難的世界地圖和中國地圖的繪制。
在vue中引入echarts颠猴,分兩種情況引入关划,一種值npm安裝包,另一種是cdn外部引入翘瓮,但是這個對于一般的echarts繪制是沒有影響的贮折。
首先安裝echarts依賴

npm install echarts -S 

你可選擇全局導入,也可以在需要的頁面導入春畔。全局的話脱货,在main.js里面,然后就可以變成全局的了律姨,就不需要在局部引進echarts了

image.png

image.png

我是封裝的組件

<template>
  <div
    :id="id"
    :style="{
      width: chartWidth,
      height: chartHeight,
      float: 'left',
      backgroundImage:
        'url(' +
        (empty == '0'
          ? require('../../../public/img/timg.gif')
          : empty == '1'
            ? require('../../../public/img/empty.png')
            : require('../../../public/img/1.png')) +
        ')',
      backgroundRepeat: 'no-repeat',
      backgroundPosition: 'center',
      backgroundSize: empty == '1' ? 'contain' : 'auto'
    }"
  />
</template>
<script>
/* echarts組件 */
import echarts from 'echarts';
export default {
  props: ['id', 'option', 'chartWidth', 'chartHeight'],
  data() {
    return {
      myChart: {},
      empty: 0
    };
  },
  watch: {
    option: {
      // 監(jiān)聽option的變化
      handler: function(newData, oldData) {
        if (JSON.stringify(newData) === JSON.stringify({})) {
          this.empty = '0';
        } else if (
          newData.series[0].data.length === 0 &&
          newData.series[0].type !== 'map'
        ) {
          this.empty = '1';
        } else {
          this.empty = '2';
        }
        this.myChart = echarts.init(document.getElementById(this.id));
        this.myChart.setOption(newData);
        this.$emit('toParent', this.myChart, this.chartWidth, this.id);
      },
      deep: true
    }
  },
  mounted() {
    // 設置echarts的寬度
    var chart = document.getElementById(this.id);
    if (this.chartWidth.indexOf('px') !== -1) {
      chart.style.width = this.chartWidth;
    } else {
      chart.style.width =
        ((window.innerWidth -
          (this.$store.state.app.sidebar.opened ? 280 : 150)) *
          this.chartWidth.slice(0, this.chartWidth.length - 1)) /
          100 +
        'px';
    }
    if (this.option) {
      /* 根據(jù)表格數(shù)據(jù)設置echarts背景圖*/
      if (Object.keys(this.option).length !== 0) {
        if (JSON.stringify(this.option) === JSON.stringify({})) {
          this.empty = '0';
        } else if (
          this.option.series[0].data.length === 0 &&
          this.option.series[0].type !== 'map'
        ) {
          this.empty = '1';
        } else {
          this.empty = '2';
        }
        this.myChart = echarts.init(document.getElementById(this.id));
        this.myChart.setOption(this.option);
        this.$emit('toParent', this.myChart, this.chartWidth, this.id);
      }
    }
  }
};
</script>

頁面引用

 <Echarts
              :id="'idWord'"
              :chart-height="'100%'"
              :chart-width="'50%'"
              :option="mapWord"
              @toParent="getEcharts"
            />
image.png

image.png
var color = ['#FA5882', '#dcbf71']
// 設置圓點
      // var points = [
      //         {name:'河南',value: [118.8062, 31.9208],itemStyle:{color:'#DCBF71'}}
      // ]
 echarts.registerMap('world', countryGeo) **npm安裝的這個是重點**
  this.mapWord = {
            backgroundColor: '#fff',
            geo: {
              map: 'world', // 與引用進來的地圖js名字一致
              roam: false, // 禁止縮放平移
              label: {
                // 隱藏地名
                show: false,
                emphasis: {
                  show: true
                }
              },
              itemStyle: {
                // 每個區(qū)域的樣式
                normal: {
                  areaColor: '#44A9E1',
                  borderWidth: 0.5,
                  borderColor: '#fff',
                  borderType: 'solid'
                },
                emphasis: {
                  areaColor: '#7151E5',
                  label: {
                    show: false,
                    color: '#7151E5'
                  }
                }
              }
            },
            series: [
              // 漣漪圖 // 散點效果
              {
                type: 'effectScatter',
                coordinateSystem: 'geo', // 表示使用的坐標系為地理坐標系
                zlevel: 2,
                rippleEffect: {
                  period: 2, // 動畫時間振峻,值越小速度越快
                  brushType: 'stroke', // 波紋繪制方式 stroke, fill
                  scale: 5 // 波紋圓環(huán)最大限制,值越大波紋越大
                },
                label: {
                  normal: {
                    // 默認的文本標簽顯示樣式
                    show: true,
                    position: 'top', // 標簽顯示的位置
                    formatter: '择份' // 標簽內容格式器
                  }
                },
                itemStyle: {
                  normal: {
                    color: color[0]
                  }
                },
                data: ZZData.map(function(dataItem) {
                  return {
                    name: dataItem[1].name,
                    value: GeoCoordMap[dataItem[1].name], // 起點的位置
                    symbolSize: dataItem[1].value // 散點的大小扣孟,通過之前設置的權重來計算,val的值來自data返回的value
                  }
                })
              },
              // 地圖線的動畫效果
              {
                // 白色航線特效圖
                type: 'lines',
                zlevel: 1, // 用于分層荣赶,z-index的效果
                effect: {
                  show: true, // 動效是否顯示
                  period: 2, // 特效動畫時間
                  trailLength: 0.2, // 特效尾跡的長度
                  // symbol: 'arrow', //箭頭圖標
                  color: '#fff', // 特效顏色
                  symbolSize: 5 // 特效大小
                },
                lineStyle: {
                  normal: {
                    // 正常情況下的線條樣式
                    color: '#FA5882',
                    width: 0, // 因為是疊加效果凤价,要是有寬度鸽斟,線條會變粗,白色航線特效不明顯
                    opacity: 1, // 尾跡線條透明度
                    curveness: -0.3 // 線條曲度
                  }
                },
                data: this.convertData(this.points) // 特效的起始利诺、終點位置
              }
              // 小飛機航線效果
              // {
              //   type: 'lines',
              //   zlevel: 2,
              //   symbol: ['none', 'arrow'],   // 用于設置箭頭
              //   symbolSize: 10,
              //   effect: {
              //     show: true,
              //     period: 6,
              //     trailLength: 0,
              //     symbol: 'pin',         // 特效形狀富蓄,可以用其他svg pathdata路徑代替
              //     symbolSize: 1
              //   },
              //   lineStyle: {
              //     normal: {
              //       color: '#dcbf71',
              //       width: 1,
              //       opacity: 0.6,
              //       curveness: -0.2
              //     }
              //   },
              //   data:this.convertData(this.data)    // 特效的起始、終點位置慢逾,一個二維數(shù)組立倍,相當于coords: convertData(item[1])
              // },
            ]
          }

最后利用混合混入,實現(xiàn)圖表自適應的效果

export const resizeEcharts = {
  watch: {
    '$store.state.cutWidth': {
      handler(newData, oldData) {
        this.resizeHandel();
      },
      deep: true
    }
  },
  methods: {
    resizeHandel() {
      for (var i = 0; i < this.echarts.length; i++) {
        var chart = document.getElementById(this.echarts[i].id);
        if (chart) {
          if (this.echarts[i].width.indexOf('px') !== -1) {
            chart.style.width = this.echarts[i].width;
          } else {
            chart.style.width =
              ((window.innerWidth - this.$store.state.cutWidth) *
                this.echarts[i].width.slice(
                  0,
                  this.echarts[i].width.length - 1
                )) /
                100 +
              'px';
          }
        }
        this.echarts[i].echart.resize();
      }
    },
    getEcharts(echart, width, id) {
      this.echarts.push({ echart: echart, id: id, width: width });
      let _this = this;
      window.addEventListener('resize', _this.resizeHandel);
    }
  },
  beforeDestroy() {
    //離開當前頁面清除定時器 及事件監(jiān)聽
    if(this.interval){
      clearInterval(this.interval);
    }
    let _this = this;
    window.removeEventListener('resize', _this.resizeHandel);
  }
};

世界地圖的繪制####

image.png

中國地圖的繪制####

image.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末侣滩,一起剝皮案震驚了整個濱河市口注,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌君珠,老刑警劉巖寝志,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異策添,居然都是意外死亡材部,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門舰攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來败富,“玉大人,你說我怎么就攤上這事摩窃∈薅#” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵猾愿,是天一觀的道長鹦聪。 經常有香客問我,道長蒂秘,這世上最難降的妖魔是什么泽本? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮姻僧,結果婚禮上规丽,老公的妹妹穿的比我還像新娘。我一直安慰自己撇贺,他們只是感情好赌莺,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著松嘶,像睡著了一般艘狭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天巢音,我揣著相機與錄音遵倦,去河邊找鬼。 笑死官撼,一個胖子當著我的面吹牛梧躺,可吹牛的內容都是我干的。 我是一名探鬼主播歧寺,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼燥狰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斜筐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蛀缝,失蹤者是張志新(化名)和其女友劉穎顷链,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屈梁,經...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嗤练,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了在讶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煞抬。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖构哺,靈堂內的尸體忽然破棺而出革答,到底是詐尸還是另有隱情,我是刑警寧澤曙强,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布残拐,位于F島的核電站,受9級特大地震影響碟嘴,放射性物質發(fā)生泄漏溪食。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一娜扇、第九天 我趴在偏房一處隱蔽的房頂上張望错沃。 院中可真熱鬧,春花似錦雀瓢、人聲如沸枢析。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽登疗。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辐益,已是汗流浹背断傲。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留智政,地道東北人认罩。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像续捂,于是被迫代替她去往敵國和親垦垂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內容