使用vue結合echarts封裝成一個可復用Vue組件


在公司做數據可視化需求的時候用到了echarts框架,下面是自己使用Vue結合echarts的封裝成一個可復用的組件的一些方法。

首先在自己的項目中安裝echarts、安裝命令為:

npm install echarts --save

  

之后在Vue項目中使用,比如現在這個組件的名字叫:EchartsComponent.vue,代碼如下

 

<template>
  <div>
    <div style="width:50%;height:200px;" :id="echarts" class="echarts"  ref="echarts"></div>
  </div>
</template>

<script>
// 引入echarts
import echarts from 'echarts'
export default {
  name: 'EchartsComponents',
  props: {
    // 接收父組件傳遞過來的信息
    chartData: {
      type: Array,
      default: ()=>[]
    }
  },
  data () {
    return {}
  },
  methods: {
    drawChart () {
      const vm = this
      // 基於准備好的dom,初始化echarts實例
     var myChart =echarts.init(document.getElementById(this.echarts))
      // 繪制圖表
      myChart.setOption({
        title: {
          text: 'ECharts 入門示例'
        },
        tooltip: {},
        xAxis: {
          data: this.chartData
        },
        yAxis: {},
        series: [
          {
            name: '銷量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      })
    }
  },
  computed: {
    echarts() {
      return 'echarts' + Math.random()*100000
    }
  },
    mounted: function () {
        const vm = this
        vm.$nextTick(()=> {
            vm.drawChart()
      })
  },
  created: () => {}
}
</script>

<style scoped>
</style>
    

這個組件在寫的時候需要有幾個注意的地方:

  1. 使用echarts.init這個方法來創建一個 ECharts 實例,返回 echartinstance,不能在單個容器上初始化多個 ECharts 實例,因此需要用到Vue的computed屬性來解決這個問題
  2. 因為把它封裝成了一個Vue組件,因此要注意父子組件之間的通信、需要用到props這個屬性
  3. 在Vue的生命周期mounted執行,並且在this.$nextTick里面執行這個方法,保證承若所有的子組件被掛載、能保證通過獲取到組件

然后在父組件中調用、這里比如父組件為Test.vue,代碼如下所示

<template>
  <div>
   <Row>
      <i-col span="12"><EchartsCoponent :chartData="chartData1"/></i-col>
      <i-col span="12"><EchartsCoponent :chartData="chartData2"/></i-col>
    </Row>
  </div>
</template>

<script>
import EchartsCoponent from './EchartsComponent'
export default {
  name: 'Test',
  data () {
    return {
      chartData1: ['襯衫', '羊毛衫', '雪紡衫', '褲子', '高跟鞋', '襪子'],
      chartData2: ['蘋果', '香蕉', '橘子', '梨子', '櫻桃', '哈密瓜']
    }
  },
  components: {
    EchartsCoponent
  },
  mounted: function() {
    const vm = this 
    vm.$nextTick(()=> {})
  } 
}
</script>

<style scoped>
</style>

里面使用到一些iview的樣式

這里需要注意的是需要把EchartsCoponent這個組件在Vue的components屬性里面注冊一下:

在頁面中的效果如下:

還有第二種方法寫組件,EchartsComponent.vue,代碼如下:

<template>
  <div>
    <div style="width:50%;height:200px;"  ref="echarts"></div>
  </div>
</template>

<script>
import echarts from 'echarts'
export default {
  name: 'EchartsComponents',
  props: {
    chartData: {
      type: Array,
      default: ()=>[]
    }
  },
  data () {
    return {
      count:1
    }
  },
  methods: {
    drawChart () {
      const vm = this
      // 基於准備好的dom,初始化echarts實例
      var myChart = echarts.init(this.$refs.echarts)
      // 繪制圖表
      myChart.setOption({
        title: {
          text: 'ECharts 入門示例'
        },
        tooltip: {},
        xAxis: {
          data: this.chartData
        },
        yAxis: {},
        series: [
          {
            name: '銷量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
          }
        ]
      })
    }
  },
  computed: {},
    mounted: function () {
        const vm = this
        vm.$nextTick(()=> {
            vm.drawChart()
      })
  },
  created: () => {}
}
</script>

<style scoped>
</style>

主要使用到vue的ref屬性,不需要使用到計算屬性:

test.vue中代碼一樣、最中實現的效果是一樣的;

 


免責聲明!

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



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