zoukankan      html  css  js  c++  java
  • 使用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中代码一样、最中实现的效果是一样的;

  • 相关阅读:
    linux —— 学习笔记(汇总)
    linux —— ubuntu 初次安装问题
    更改CMD默认的初始路径
    深入浅出理解linux inode结构
    重拾简单的linux指令之info 【转】
    Python 中数据的序列化和反序列化(json处理)
    day07
    Python 的反射机制
    Python 的 __new__()方法与实例化
    Classes as objects
  • 原文地址:https://www.cnblogs.com/fanzhanxiang/p/10085821.html
Copyright © 2011-2022 走看看