iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue3中echarts怎么封装
  • 483
分享到

vue3中echarts怎么封装

2023-07-05 03:07:54 483人浏览 泡泡鱼
摘要

这篇“vue3中echarts怎么封装”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3中echarts怎么封装”文章吧

这篇“vue3中echarts怎么封装”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3中echarts怎么封装”文章吧。

思路
  1. 结合项目需求,针对不同类型的图表,配置基础的默认通用配置,例如x/y,label,图例等的样式

  2. 创建图表组件实例(不要使用id,容易重复,还需要操作dom,直接用ref获取当前组件的el来创建图表),提供type(图表类型),和options(图表配置)两个必要属性

  3. 根据传入type,加载默认的图表配置

  4. 深度监听传入的options,变化时更新覆盖默认配置,更新图表

  5. 提供事件支持,支持echart事件按需绑定交互

注意要确保所有传入图表组件的options数组都是shallowReactive类型,避免数组量过大,深度响应式导致性能问题

目录结构

├─v-charts│  │  index.ts     // 导出类型定义以及图表组件方便使用│  │  type.d.ts    // 各种图表的类型定义│  │  useCharts.ts // 图表hooks│  │  v-charts.vue // echarts图表组件│  ││  └─options // 图表配置文件│          bar.ts│          gauge.ts│          pie.ts

组件代码

v-charts.vue

<template>  <div ref="chartRef" /></template><script setup>import { PropType } from "vue";import * as echarts from "echarts/core";import { useCharts, ChartType, ChartsEvents } from "./useCharts";interface EventEmitsType {  <T extends ChartsEvents.EventType>(e: `${T}`, event: ChartsEvents.Events[Uncapitalize<T>]): void;}defineOptions({  name: "VCharts"});const props = defineProps({  type: {    type: String as PropType<ChartType>,    default: "bar"  },  options: {    type: Object as PropType<echarts.EChartsCoreOption>,    default: () => ({})  }});// 定义事件,提供ts支持,在组件使用时可获得友好提示defineEmits<EventEmitsType>();const { type, options } = toRefs(props);const chartRef = shallowRef();const { charts, setOptions, initChart } = useCharts({ type, el: chartRef });onMounted(async () => {  await initChart();  setOptions(options.value);});watch(  options,  () => {    setOptions(options.value);  },  {    deep: true  });defineExpose({  $charts: charts});</script><style scoped>.v-charts {  width: 100%;  height: 100%;  min-height: 200px;}</style>

useCharts.ts

import { ChartType } from "./type";import * as echarts from "echarts/core";import { ShallowRef, Ref } from "vue";import {  TitleComponent,  LegendComponent,  TooltipComponent,  GridComponent,  DatasetComponent,  TransfORMComponent} from "echarts/components";import { BarChart, LineChart, PieChart, GaugeChart } from "echarts/charts";import { LabelLayout, UniversalTransition } from "echarts/features";import { canvasRenderer } from "echarts/renderers";const optionsModules = import.meta.glob<{ default: echarts.EChartsCoreOption }>("./optionsclass ChartsResize {  #charts = new Set<echarts.ECharts>(); // 缓存已经创建的图表实例  #timeId = null;  constructor() {    window.addEventListener("resize", this.handleResize.bind(this)); // 视口变化时调整图表  }  getCharts() {    return [...this.#charts];  }  handleResize() {    clearTimeout(this.#timeId);    this.#timeId = setTimeout(() => {      this.#charts.forEach(chart => {        chart.resize();      });    }, 500);  }  add(chart: echarts.ECharts) {    this.#charts.add(chart);  }  remove(chart: echarts.ECharts) {    this.#charts.delete(chart);  }  removeListener() {    window.removeEventListener("resize", this.handleResize);  }}export const chartsResize = new ChartsResize();export const useCharts = ({ type, el }: ChartHookOption) => {  echarts.use([    BarChart,    LineChart,    BarChart,    PieChart,    GaugeChart,    TitleComponent,    LegendComponent,    TooltipComponent,    GridComponent,    DatasetComponent,    TransformComponent,    LabelLayout,    UniversalTransition,    CanvasRenderer  ]);  const charts = shallowRef<echarts.ECharts>();  let options!: echarts.EChartsCoreOption;  const getOptions = async () => {    const moduleKey = `./options/${type.value}.ts`;    const { default: defaultOption } = await optionsModules[moduleKey]();    return defaultOption;  };  const setOptions = (opt: echarts.EChartsCoreOption) => {    charts.value.setOption(opt);  };  const initChart = async () => {    charts.value = echarts.init(el.value);    options = await getOptions();    charts.value.setOption(options);    chartsResize.add(charts.value); // 将图表实例添加到缓存中    initEvent(); // 添加事件支持  };    const attrs = useAttrs();  const initEvent = () => {    Object.keys(attrs).forEach(attrKey => {      if (/^on/.test(attrKey)) {        const cb = attrs[attrKey];        attrKey = attrKey.replace(/^on(Chart)?/, "");        attrKey = `${attrKey[0]}${attrKey.substring(1)}`;        typeof cb === "function" && charts.value?.on(attrKey, cb as () => void);      }    });  };  onBeforeUnmount(() => {    chartsResize.remove(charts.value); // 移除缓存  });  return {    charts,    setOptions,    initChart,    initEvent  };};export const chartsOptions = <T extends echarts.EChartsCoreOption>(option: T) => shallowReactive<T>(option);export * from "./type.d";

type.d.ts

// import * as echarts from 'echarts/core';import * as echarts from 'echarts'import { XAXisComponentOption, YAXisComponentOption } from 'echarts';import { ECElementEvent, SelectChangedPayload, HighlightPayload,  } from 'echarts/types/src/util/types'import {  TitleComponentOption,  TooltipComponentOption,  GridComponentOption,  DatasetComponentOption,  AriaComponentOption,  AxisPointerComponentOption,  LegendComponentOption,} from 'echarts/components';// 组件import {  // 系列类型的定义后缀都为 SeriesOption  BarSeriesOption,  LineSeriesOption,  PieSeriesOption,  FunnelSeriesOption,  GaugeSeriesOption} from 'echarts/charts';type Options = LineECOption | BarECOption | PieECOption | FunnelOptiontype BaseOptionType = XAXisComponentOption | YAXisComponentOption | TitleComponentOption | TooltipComponentOption | LegendComponentOption | GridComponentOptiontype BaseOption = echarts.ComposeOption<BaseOptionType>type LineECOption = echarts.ComposeOption<LineSeriesOption | BaseOptionType>type BarECOption = echarts.ComposeOption<BarSeriesOption | BaseOptionType>type PieECOption = echarts.ComposeOption<PieSeriesOption | BaseOptionType>type FunnelOption = echarts.ComposeOption<FunnelSeriesOption | BaseOptionType>type GaugeECOption = echarts.ComposeOption<GaugeSeriesOption | GridComponentOption>type EChartsOption = echarts.EChartsOption;type ChartType = 'bar' | 'line' | 'pie' | 'gauge'// echarts事件namespace ChartsEvents {  // 鼠标事件类型  type MouseEventType = 'click' | 'dblclick' | 'mousedown' | 'mousemove' | 'mouseup' | 'mouseover' | 'mouseout' | 'globalout' | 'contextmenu' // 鼠标事件类型  type MouseEvents = {    [key in Exclude<MouseEventType,'globalout'|'contextmenu'> as `chart${Capitalize<key>}`] :ECElementEvent  }  // 其他的事件类型极参数  interface Events extends MouseEvents {    globalout:ECElementEvent,    contextmenu:ECElementEvent,    selectchanged: SelectChangedPayload;    highlight: HighlightPayload;    legendselected: { // 图例选中后的事件      type: 'legendselected',      // 选中的图例名称      name: string      // 所有图例的选中状态表      selected: {        [name: string]: boolean      }    };    // ... 其他类型的事件在这里定义  }  // echarts所有的事件类型  type EventType = keyof Events}export {  BaseOption,  ChartType,  LineECOption,  BarECOption,  Options,  PieECOption,  FunnelOption,  GaugeECOption,  EChartsOption,  ChartsEvents}

options/bar.ts

import { BarECOption } from "../type";const options: BarECOption = {  legend: {},  tooltip: {},  xAxis: {    type: "cateGory",    axisLine: {      lineStyle: {        // type: "dashed",        color: "#C8D0D7"      }    },    axisTick: {      show: false    },    axisLabel: {      color: "#7D8292"    }  },  yAxis: {    type: "value",    alignTicks: true,    splitLine: {      show: true,      lineStyle: {        color: "#C8D0D7",        type: "dashed"      }    },    axisLine: {      lineStyle: {        color: "#7D8292"      }    }  },  grid: {    left: 60,    bottom: "8%",    top: "20%"  },  series: [    {      type: "bar",      barWidth: 20,      itemStyle: {        color: {          type: "linear",          x: 0,          x2: 0,          y: 0,          y2: 1,          colorStops: [            {              offset: 0,              color: "#62A5FF" // 0% 处的颜色            },            {              offset: 1,              color: "#3365FF" // 100% 处的颜色            }          ]        }      }      // label: {      //   show: true,      //   position: "top"      // }    }  ]};export default options;

项目中使用

index.vue

<template>  <div>    <section>      <div class="device-statistics chart-box">        <div>累计设备接入统计</div>        <v-charts          type="bar"          :options="statisDeviceByUserObjectOpts"          @selectchanged="selectchanged"          @chart-click="handleChartClick"        />      </div>      <div class="coordinate-statistics chart-box">        <div>坐标数据接入统计</div>        <v-charts type="bar" :options="statisCoordAccess" />      </div>    </section>  </div></template><script setup>import {  useStatisDeviceByUserObject,} from "./hooks";// 设备分类统计const { options: statisDeviceByUserObjectOpts,selectchanged,handleChartClick } = useStatisDeviceByUserObject();</script>

/hooks/useStatisDeviceByUserObject.ts

export const useStatisDeviceByUserObject = () => {  // 使用chartsOptions确保所有传入v-charts组件的options数据都是## shallowReactive浅层作用形式,避免大量数据导致性能问题  const options = chartsOptions<BarECOption>({    yAxis: {},    xAxis: {},    series: []  });  const init = async () => {    const xData = [];    const sData = [];    const dicts = useHashMapDics<["dev_user_object"]>(["dev_user_object"]);    const data = await statisDeviceByUserObject();    dicts.dictionaryMap.dev_user_object.forEach(({ label, value }) => {      if (value === "6") return; // 排除其他      xData.push(label);      const temp = data.find(({ name }) => name === value);      sData.push(temp?.Qty || 0);            // 给options赋值时要注意options是浅层响应式      options.xAxis = { data: xData };       options.series = [{ ...options.series[0], data: sData }];    });  };    // 事件  const selectchanged = (params: ChartsEvents.Events["selectchanged"]) => {    console.log(params, "选中图例了");  };  const handleChartClick = (params: ChartsEvents.Events["chartClick"]) => {    console.log(params, "点击了图表");  };    onMounted(() => {    init();  });  return {    options,    selectchanged,    handleChartClick  };};

使用时输入@可以看到组件支持的所有事件:

vue3中echarts怎么封装

以上就是关于“vue3中echarts怎么封装”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: vue3中echarts怎么封装

本文链接: https://www.lsjlt.com/news/349269.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue3中echarts怎么封装
    这篇“vue3中echarts怎么封装”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue3中echarts怎么封装”文章吧...
    99+
    2023-07-05
  • vue3怎么封装ECharts组件
    一、前言前端开发需要经常使用ECharts图表渲染数据信息,在一个项目中我们经常需要使用多个图表,选择封装ECharts组件复用的方式可以减少代码量,增加开发效率。二、封装ECharts组件为什么要封装组件避免重复的工作量,提升复用性使代码...
    99+
    2023-05-20
    Vue3 echarts
  • vue3封装ECharts组件详解
    目录一、前言二、封装ECharts组件为什么要封装组件代码实现:ECharts组件:ECharts组件的用法: 一、前言 前端开发需要经常使用ECharts图表渲染数据信息...
    99+
    2023-05-18
    vue3 封装ECharts组件 vue3 封装ECharts vue3 ECharts
  • vue3使用echarts并封装echarts组件方式
    目录前言一、安装并导入echart1.npm下载包2.配置echarts二、使用echarts三、封装echarts为组件前言 本文使用的echarts版本为5.3.1,详细文档可见...
    99+
    2022-11-13
    vue3使用echarts 封装echarts组件 vue3封装echarts组件
  • 怎么正确封装ECharts
    这篇文章主要介绍“怎么正确封装ECharts”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么正确封装ECharts”文章能帮助大家解决问题。本文涉及 : TypeScript、Vue3、 echa...
    99+
    2023-07-05
  • Vue3怎么封装组件
    这篇文章主要讲解了“Vue3怎么封装组件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3怎么封装组件”吧!例如我们在使用element的标签页tabs组件时,如下图所示:tabs组件可...
    99+
    2023-07-05
  • 聊聊vue3中echarts用什么形式封装最好?(代码详解)
    思路结合项目需求,针对不同类型的图表,配置基础的默认通用配置,例如x/y,label,图例等的样式创建图表组件实例(不要使用id,容易重复,还需要操作dom,直接用ref获取当前组件的el来创建图表),提供type(图表类型),和optio...
    99+
    2023-05-14
    ECharts Vue.js
  • vue3中axios整体封装
    在vue3.x版本中进行封装使用promise封装post和get方法api作为单独模块维护适配vue.config.js中proxy代理结合async 和 await 1 安装 npm install axios; 2 创建http模块 ...
    99+
    2023-08-16
    vue.js 前端 javascript
  • vue项目中如何封装echarts
    本文小编为大家详细介绍“vue项目中如何封装echarts”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中如何封装echarts”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。场景Echarts使用时,...
    99+
    2023-06-29
  • vue3中的hook简单封装
    目录vue3的hook封装vue3的hooks总结下面总结一下如何去书写hooks计数器的hookvue3的hook封装 vue3最新鲜的就是组合式API了,通过组合式API我们可以...
    99+
    2024-04-02
  • vue中封装echarts公共组件过程
    目录1、安装echarts2、在mian.js中全局引入3、下面开始封装图表4、接下来只需要在需要显示图表的地方引入Echart.vue定义图表公共样式是为了统一同一网站各页面图表的...
    99+
    2024-04-02
  • vue2项目中如何封装echarts地图
    这篇文章主要介绍了vue2项目中如何封装echarts地图的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue2项目中如何封装echarts地图文章都会有所收获,下面我们一起来看看吧。效果图先上个效果图吧,说明...
    99+
    2023-06-29
  • vue中如何封装echarts公共组件
    这篇文章主要讲解了“vue中如何封装echarts公共组件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中如何封装echarts公共组件”吧!定义图表公共样式是为了统一同一网站各页面图...
    99+
    2023-06-30
  • vue3如何封装axios
    本文小编为大家详细介绍“vue3如何封装axios”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3如何封装axios”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。简介axios是一个基于promise的网...
    99+
    2023-07-02
  • vue3怎么解决axios请求封装问题
    vue3实战axios请求封装问题1、在src目录下创建http文件夹,在http文件夹下分别创建index.js、request.js、api.js2、index.js的作用:用于导出api.js定义的所有接口,代码如下export * ...
    99+
    2023-05-22
    Vue3 axios
  • vue项目如何雅的封装echarts
    这篇文章主要介绍“vue项目如何雅的封装echarts”,在日常操作中,相信很多人在vue项目如何雅的封装echarts问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue项目如何雅的封装echarts”的疑...
    99+
    2023-06-29
  • vue3中的抽离封装方法实现
    目录vue3的抽离封装方法:1.新建公共utils/publicModule文件 2.vue组件页面中引入使用vue3的抽离封装方法: vue3中的任何一个组合式api都可...
    99+
    2022-11-13
    vue3抽离封装 vue3抽离
  • vue3如何封装Notification组件
    这篇文章给大家分享的是有关vue3如何封装Notification组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。弹窗组件的思路基本一致:向body插入一段HTML。我将从创建、插入、移除这三个方面来说我的做法...
    99+
    2023-06-29
  • vue项目中封装echarts的优雅方式分享
    目录场景需求代码总览实现components--chart--index.vuecomponents--chart--index.jscomponents--chart--optio...
    99+
    2024-04-02
  • vue2 vue3中使用Echarts详细
    目录1、安装2、vue2中使用Echarts在main.js文件中给定一个容器3、vue3中使用Echarts在根组件里引入echart,一般是App.vue在需要使用的页面,定义d...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作