使用vue结合echarts封装成一个可复用Vue组件

在公司做数据可视化需求的时候用到了echarts框架,下面是自己使用Vue结合echarts的封装成一个可复用的组件的一些方法。

首先在自己的项目中安装echarts、安装命令为:

npm install echarts --save

  

之后在Vue项目中使用,比如现在这个组件的名字叫:EchartsComponent.vue,代码如下

<template>
  <div>
    <div style="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="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中代码一样、最中实现的效果是一样的;

原文地址:https://www.cnblogs.com/fanzhanxiang/p/10085821.html