Vue3.0引入Echarts并使用

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

一、Vue3.0全局引入Echarts

1. 安装echarts

npm install echarts --save

2. main.js引入echarts

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

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>

二、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 };

2. main.js

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

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>

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 }

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Vue3中按需加载Echarts可以通过将Echarts库作为依赖项引入,并在需要使用的组件中进行初始化和配置。以下是三种不同的方法来实现按需加载Echarts: 方法一:在组件中使用Echarts组件 你可以将Echarts设置为一个组件,然后在需要使用的页面中引入该组件,并传入相应的配置项。在这种方法中,你需要在组件的setup函数中引入Echarts库,并使用ref引用图表容器,然后在onMounted钩子函数中初始化图表,并在onBeforeUnmount钩子函数中销毁图表。 方法二:在组件中使用Echarts实例 你可以将Echarts实例作为一个组件的属性传递,并在组件内部的template中使用该实例。在这种方法中,你需要在组件的setup函数中引入Echarts库,并使用defineProps定义props,然后使用ref引用图表容器,接着在onMounted钩子函数中初始化图表,并在onBeforeUnmount钩子函数中销毁图表。 方法三:在组件中直接使用Echarts 你可以在组件中直接使用Echarts,而不需要将其作为组件引入[3]。在这种方法中,你需要在组件的setup函数中引入Echarts库,并在onMounted钩子函数中初始化图表。 以上是三种在Vue3中按需加载Echarts的方法。根据你的实际需求和项目结构,你可以选择适合你的方法来实现按需加载Echarts。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue3中使用echart,按需引入和vite打包优化](https://blog.csdn.net/sinat_35082096/article/details/125971175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [vue3中按需引入echarts](https://blog.csdn.net/m0_52518047/article/details/128601502)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值