• Vue3.0引入Echarts并使用


    本文主要总结Vue3.0 中全局引用echarts及封装的公共方法。封装的公共方法参考这里(感恩.gif)

    一、Vue3.0全局引入Echarts

    1. 安装echarts

    npm install echarts --save
    
    • 1

    2. main.js引入echarts

    // 引入 echarts
    import * as echarts from "echarts";
    const app = createApp(App);
    // 全局挂载 echarts
    app.config.globalProperties.$echarts = echarts;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. vue文件里使用

    <template>
      <div
        ref="lineChart"
        id="lineChart"
        :style="{ width: '800px', height: '400px' }"
      ></div>
    </template>
    
    <script>
    import { getCurrentInstance, onMounted } from "vue";
    export default {
      setup() {
        // 通过 internalInstance.appContext.config.globalProperties 获取全局属性或方法
        let internalInstance = getCurrentInstance();
        let echarts = internalInstance.appContext.config.globalProperties.$echarts;
    
        onMounted(() => {
          const dom = document.getElementById("lineChart");
          const myChart = echarts.init(dom); // 初始化echarts实例
          const option = {···}; // 图表配置参数
          myChart.setOption(option);
          // 设置实例参数
          window.onresize = () => {
            myChart.resize();
          };
        });
        return {};
      },
    };
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    二、Vue3.0 封装echarts公共方法

    使用Echarts做数据大屏的时候,需要初始化多个图表,每个图表的都要进行初始化对应的DOM元素绑定var myChart = echarts.init(document.getElementById(‘eleDom’));封装一个公共方法比较方便。

    1. 在utility目录下建立initEcharts.js文件

    // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
    import * as echarts from "echarts/core";
    // 引入各种图表,图表后缀都为 Chart
    import { BarChart, PieChart, LineChart } from "echarts/charts";
    // 引入提示框,标题,直角坐标系等组件,组件后缀都为 Component
    import {
      TitleComponent,
      TooltipComponent,
      GridComponent,
      LegendComponent,
      // GeoCoComponent
    } from "echarts/components";
    // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
    import { CanvasRenderer } from "echarts/renderers";
    
    // DIV 宽高变化监听
    import { EleResize } from "@/utility/eleResize";
    
    // 注册必须的组件
    echarts.use([
      TitleComponent,
      TooltipComponent,
      GridComponent,
      LegendComponent,
      BarChart,
      PieChart,
      LineChart,
      CanvasRenderer,
    ]);
    
    /** 封装 echart初始化方法,需要传入 绘制图表的dom元素和绘制图表缩需要的相关配置项 *
     *   同时还添加了图表自动适应dom的宽高变化的功能,需要引入EleResize.js
     */
    function drawChart(dom, option) {
      const $Chart = echarts.init(document.getElementById(dom));
      const resizeDiv = document.getElementById(dom);
      $Chart.setOption(option);
      const listener = function () {
        console.log("divRsize");
        $Chart.resize();
      };
      EleResize.on(resizeDiv, listener);
      return $Chart;
    }
    
    export { drawChart };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    2. main.js

    // 引入封装好的初始化方法
    import { drawChart } from "@/utility/initEcharts";
    // 在vue的原型上绑上 刚刚封装的方法,将来可以在组件中通过this.$drawChart()来进行调用
    const app = createApp(App);
    app.config.globalProperties.$drawChart = drawChart;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. 在vue文件中使用

    只需要配置option即可

    <template>
       <div
         ref="lineChart"
         id="lineChart"
         :style="{ width: '800px', height: '400px' }"
       ></div>
    </template>
    
    <script>
    const domEle = "lineChart";
    // 图表配置项
    const option = {···};
    export default {
      mounted() {
        this.darwChart();
      },
      data() {
        return {
          lineChart: null,
        };
      },
      methods: {
        darwChart() {
    	  this.lineChart = this.$drawChart(domEle, option);
        },
      },
    };
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    4. JS监听div的resize事件EleResize.js

    EleResize.js

    var EleResize = {
      _handleResize: function(e) {
        var ele = e.target || e.srcElement
        var trigger = ele.__resizeTrigger__
        if (trigger) {
          var handlers = trigger.__z_resizeListeners
          if (handlers) {
            var size = handlers.length
            for (var i = 0; i < size; i++) {
              var h = handlers[i]
              var handler = h.handler
              var context = h.context
              handler.apply(context, [e])
            }
          }
        }
      },
      _removeHandler: function(ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (handlers) {
          var size = handlers.length
          for (var i = 0; i < size; i++) {
            var h = handlers[i]
            if (h.handler === handler && h.context === context) {
              handlers.splice(i, 1)
              return
            }
          }
        }
      },
      _createResizeTrigger: function(ele) {
        var obj = document.createElement('object')
        obj.setAttribute(
          'style',
          'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;'
        )
        obj.onload = EleResize._handleObjectLoad
        obj.type = 'text/html'
        ele.appendChild(obj)
        obj.data = 'about:blank'
        return obj
      },
      _handleObjectLoad: function(evt) {
        this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__
        this.contentDocument.defaultView.addEventListener(
          'resize',
          EleResize._handleResize
        )
      }
    }
    if (document.attachEvent) {
      // ie9-10
      EleResize.on = function(ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (!handlers) {
          handlers = []
          ele.__z_resizeListeners = handlers
          ele.__resizeTrigger__ = ele
          ele.attachEvent('onresize', EleResize._handleResize)
        }
        handlers.push({
          handler: handler,
          context: context
        })
      }
      EleResize.off = function(ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (handlers) {
          EleResize._removeHandler(ele, handler, context)
          if (handlers.length === 0) {
            ele.detachEvent('onresize', EleResize._handleResize)
            delete ele.__z_resizeListeners
          }
        }
      }
    } else {
      EleResize.on = function(ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (!handlers) {
          handlers = []
          ele.__z_resizeListeners = handlers
    
          if (getComputedStyle(ele, null).position === 'static') {
            ele.style.position = 'relative'
          }
          var obj = EleResize._createResizeTrigger(ele)
          ele.__resizeTrigger__ = obj
          obj.__resizeElement__ = ele
        }
        handlers.push({
          handler: handler,
          context: context
        })
      }
      EleResize.off = function(ele, handler, context) {
        var handlers = ele.__z_resizeListeners
        if (handlers) {
          EleResize._removeHandler(ele, handler, context)
          if (handlers.length === 0) {
            var trigger = ele.__resizeTrigger__
            if (trigger) {
              trigger.contentDocument.defaultView.removeEventListener(
                'resize',
                EleResize._handleResize
              )
              ele.removeChild(trigger)
              delete ele.__resizeTrigger__
            }
            delete ele.__z_resizeListeners
          }
        }
      }
    }
    export { EleResize }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
  • 相关阅读:
    zookeeper连接客户端操作数据时报错Socket is not connected
    windows下安装配置CGAL
    图形处理软件Photoshop Elements 2020 mac中文版 ps简化版
    Linux发展历程
    window.eventBus 在Vue中的使用方法(一)
    微信小程序使用textarea后内容随着屏幕上下移动的问题
    Redis数据结构——五种数据类型
    软件项目管理 6.8.专家估算法
    Spring Boot配置文件和yaml语法
    找到页面当前元素z-index最高的数值
  • 原文地址:https://blog.csdn.net/onepiece1991/article/details/127982238