1. 程式人生 > >基於vue2定義自己的圖表echart元件

基於vue2定義自己的圖表echart元件

先安裝echarts cnpm i echarts -S,然後定義父元件

<template>
  <div>
       <echarts :option="echartOpion"></echarts>
  </div>
</template>
<script>
  import echarts from './echarts.vue' // 引入子元件
  export default {
    data() {
      return {
        // 傳給子元件的值,這裡以柱狀圖的引數為例,可以參考官網 http://www.echartsjs.com/examples/
        echartOpion: {
          color: ['#3398DB'],
          tooltip: {
            trigger: 'axis',
            axisPointer: { // 座標軸指示器,座標軸觸發有效
              type: 'shadow' // 預設為直線,可選為:'line' | 'shadow'
            }
          },
          grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
          },
          xAxis: [{
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
            axisTick: {
              alignWithLabel: true
            }
          }],
          yAxis: [{
            type: 'value'
          }],
          series: [{
            name: '直接訪問',
            type: 'bar',
            barWidth: '60%',
            data: [10, 52, 200, 334, 390, 330, 220]
          }]
        },
        cloneOption: null
      }
    },
    components: {
      echarts //匯入元件
    },
    mounted() {
    }
  }
</script>

然後是子元件

<template>
  <div>
     <div style="height:500px;width:500px" ref="myEchart">
  </div>
  </div>
</template>
<script>
  import echarts from 'echarts'
  export default {
    data() {
      return {
        chart: null
      }
    },
    props: {
      // 圖表的資料是否遠端請求
      mapdata: {
        type: String,
        default: ''
      },
      // 直接從父元件獲取
      option: Object
    },
    watch: {
      // 監聽父元件傳過來的option值
      option(val) {
        if(this.chart) {
          // 是否存在資料,存在則設定值否則清空
          // 這裡的setOption()和clear()方法為echart提供的方法,可參照http://www.echartsjs.com/api.html#echarts
          this.option ? this.chart.setOption(val) : this.chart.clear();
        }
      }
    },
    methods: {
      initChart() {
        // 初始化
        this.chart = echarts.init(this.$refs.myEchart);
        // 把配置和資料放這裡
        this.chart.setOption(this.option);
      }
    },
    mounted() {
      // 在這裡上面定義了一個mapdata,如果存在則傳送請求後設置值,方法一樣
      this.initChart();
    },
    beforeDestroy() {
      if (!this.chart) {
        return
      }
      this.chart.dispose();// 銷燬
      this.chart = null;
    }
  }
</script>

這樣就可以引入echart了,不過這裡有一個問題就是不同的圖配置不一樣,而且我們肯很多地方都用到,所以我們要把配置也就是option裡面的東西提出來作為公共的部分,這裡以柱狀圖的配置為例:先新建一個options.js檔案,檔案程式碼如下:

export default {
  data() {
    return {
      // 暴露出公共配置
      barOption: {
        color: ['#3398DB'],
        tooltip: {
          trigger: 'axis',
          axisPointer: { // 座標軸指示器,座標軸觸發有效
            type: 'shadow' // 預設為直線,可選為:'line' | 'shadow'
          }
        },
        grid: {
          left: '3%',
          right: '4%',
          bottom: '3%',
          containLabel: true
        },
        xAxis: [{
          type: 'category',
          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
          axisTick: {
            alignWithLabel: true
          }
        }],
        yAxis: [{
          type: 'value'
        }],
        series: [{
          name: '直接訪問',
          type: 'bar',
          barWidth: '60%',
          data: [10, 52, 200, 334, 390, 330, 220]
        }]
      }
    }
  },
  methods: {
    // 深度拷貝物件或者陣列
    clone(obj) {
      return JSON.parse(JSON.stringify(obj));
    }
  }
}

這時候只需要在需要的地方引入這個配置就可以,父檔案修改如下

<template>
  <div>
       <echarts :option="echartOpion"></echarts>
  </div>
</template>
<script>
  import echarts from './echarts.vue' // 引入子元件
  import chartsOps from './options.js' // 公共配置檔案
  export default {
    mixins: [chartsOps], // 這裡mixins的作用比直接引入元件的好處是可以直接呼叫元件裡面的方法和屬性
    data() {
      return {
        // 傳給子元件的值,這裡以柱狀圖的引數為例,可以參考官網 http://www.echartsjs.com/examples/
        echartOpion: {}
      }
    },
    components: {
      echarts
    },
    mounted() {
      // 將配置拷貝一份出來賦值給echartOpion,這時候可以隨意修改echartOpion裡面的屬性,賦值為自己的資料:
     // 如this.echartOpion.xAxis = xxx
      this.echartOpion = this.clone(this.barOption);
    }
  }
</script>

這裡只是介紹了柱狀圖的配置,其他的如熱力圖,餅圖等配置一樣方法,可以將所有配置寫在一個檔案也可以每種圖寫一個檔案好區分,個人愛好,以上