vue3 封装ECharts组件

news2024/12/23 19:49:26

一、前言

前端开发需要经常使用ECharts图表渲染数据信息,在一个项目中我们经常需要使用多个图表,选择封装ECharts组件复用的方式可以减少代码量,增加开发效率。

ECharts图表大家应该用的都比较多,基础的用法就不细说了,具体用法参考ECharts官网。

二、封装ECharts组件

为什么要封装组件

  • 避免重复的工作量,提升复用性
  • 使代码逻辑更加清晰,方便项目的后期维护
  • 封装组件可以让使用者不去关心组件的内部实现以及原理,能够使一个团队更好的有层次的去运行

封装的ECharts组件实现了以下的功能:

  • 使用组件传递ECharts中的 option 属性
  • 手动/自动设置chart尺寸
  • chart自适应宽高
  • 动态展示获取到的后端数据

本文使用的是vue3 + typescript的写法。

代码实现:

ECharts组件:

<template>
  <div :id="id" :class="className" :style="{ height, width }" />
</template>
<script setup lang="ts">
//按需导入需要用到的 vue函数 和 echarts
import { onMounted, onBeforeUnmount, defineProps, watch } from "vue";
import * as echarts from 'echarts';
//获取 dom 和 父组件数据 并定义"myChart"用于初始化图表
let myChart: echarts.ECharts;
const props = defineProps({
  id: {
    type: String,
    default: 'chart',
    required: true
  },
  className: {
    type: String,
    default: ''
  },
  width: {
    type: String,
    default: '100%',
  },
  height: {
    type: String,
    default: '300px',
  },
  loading: {
    type: Boolean,
    default: true,
  },
  fullOptions: {
    type: Object,
    default: () => ({}),
    required: true
  },
})
//重绘图表函数
const resizeHandler = () => {
  myChart.resize();
}
//设置防抖,保证无论拖动窗口大小,只执行一次获取浏览器宽高的方法
const debounce = (fun: { (): void; (): void; }, delay: number | undefined) => {
  let timer: number | undefined;
  return function () {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fun();
    }, delay);
  }
};
const cancalDebounce = debounce(resizeHandler, 50);
//页面成功渲染,开始绘制图表
onMounted(() => {
  //配置为 svg 形式,预防页面缩放而出现模糊问题;图表过于复杂时建议使用 Canvas
  myChart = echarts.init(document.getElementById(props.id) as HTMLDivElement, { renderer: 'svg' })
  myChart.showLoading({
    text: '',
    color: '#409eff',
    textColor: '#000',
    maskColor: 'rgba(255, 255, 255, .95)',
    zlevel: 0,
    lineWidth: 2,
  });
  if (!props.loading) {
    myChart.hideLoading();
    myChart.setOption(props.fullOptions.options, true);
  }
  //自适应不同屏幕时改变图表尺寸
  window.addEventListener('resize', cancalDebounce);
})
//页面销毁前,销毁事件和实例
onBeforeUnmount(() => {
  window.removeEventListener('resize', cancalDebounce)
  myChart.dispose()
})
//监听图表数据时候变化,重新渲染图表
watch(() => [props.fullOptions.options, props.loading], () => {
  if (!props.loading) {
    myChart.hideLoading();
    myChart.setOption(props.fullOptions.options, true);
  }
}, { deep: true })
</script>

ECharts组件的用法: 

<template>
  <Echarts
    id="echarts"
    height="300px"
    :full-options="echartsOptions"
    :loading="loading"
  >
  </Echarts>
</template>

<script setup lang="ts">
// 引进Echarts 组件
import Echarts from '@/components/Echarts/Echarts.vue';
// 引进Echarts 的options配置文件,可根据项目模块来创建该配置文件
import chartOption from '@/components/Echarts/options';

const echartsOptions = reactive({
  options: { },
  init: false
});
// 此处可请求接口来获取数据
// 我的options配置使用的是dataset的形式,传进options中的两个参数data(图表的数据)和dimension(图表的维度),
onMounted(() => {
  const testData = [26,27,24,23];
  const testDimensions = ['家用电器','户外运动','汽车用品','手机数码'];
  echartsOptions.options = chartOption.testOption(testData, testDimensions);
});
</script>

options.ts文件

// 所有用到的 echarts option 都在这里进行配置
const chartOption = {
  // 温湿度折线图
  testOption(data: any, dimensions: any) {
    const option = {
      grid: {
        left: '2%',
        right: '2%',
        bottom: '10%',
        containLabel: true
      },
      legend: {
        top: 'bottom',
        textStyle: {
          color: '#999'
        }
      },

      dataset: {
        dimensions: dimensions,
        source: data
      },
      series: [
        {
          name: 'Nightingale Chart',
          type: 'pie',
          radius: [50, 130],
          center: ['50%', '50%'],
          roseType: 'area',
          itemStyle: {
            borderRadius: 1,
            color: function (params: any) {
              //自定义颜色
              const colorList = ['#409EFF', '#67C23A', '#E6A23C', '#F56C6C'];
              return colorList[params.dataIndex];
            }
          }
        }
      ]
    };
    return option;
  }
}

效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何成为企业急需的技术人才:掌握这些技能,提升你的实力和竞争力

在当前竞争激烈的互联网环境中&#xff0c;作为程序员等技术岗&#xff0c;必须不断的学习&#xff0c;才能不断提升自身实力&#xff0c;锻炼自身技能。想要成为一名企业急需的技术人才&#xff0c;需要学习哪些技能呢&#xff1f; 一、IT技术发展背景及历程 IT技术是当今社…

如何借助分布式存储 JuiceFS 加速 AI 模型训练

传统的机器学习模型&#xff0c;数据集比较小&#xff0c;模型的算法也比较简单&#xff0c;使用单机存储&#xff0c;或者本地硬盘就足够了&#xff0c;像 JuiceFS 这样的分布式存储并不是必需品。 随着近几年深度学习的蓬勃发展&#xff0c;越来越多的团队开始遇到了单机存储…

【22-23 春学期】人工智能基础--AI作业6-误差反向传播

老师发布作业链接&#xff1a;(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 目录 老师发布作业链接&#xff1a;(429条消息) 【22-23 春学期】AI作业6-误差反向传播_HBU_David的博客-CSDN博客 1.梯度下降 2.反向传播 3.计算图 4.使用Numpy…

ROS第四十四节——路径规划

1.新建launch文件 nav05_path.launch <launch><node pkg"move_base" type"move_base" respawn"false" name"move_base" output"screen" clear_params"true"><rosparam file"$(find nav_dem…

Mybatis 知识总结1(入门、JDBC、数据库连接池、lombok介绍)

Mybatis 知识总结&#xff08;一&#xff09; 3.1 Mybatis 介绍 什么是 Mybatis ? MyBatis 是一款优秀的持久层框架&#xff0c;用户简化 JDBC 的开发。MyBatis 是 Apache 的一个开源项目 iBaits&#xff0c;2010年这个项目由 apache 迁移到了 google code&#xff0c;并且改…

Chapter 6 :CDC Constraints(ug903)

6.1 About CDC Constraints 跨时钟域&#xff08;CDC&#xff09;约束适用于具有不同发射和捕获时钟的时序路径。根据发射和捕获时钟的关系以及在CDC路径上设置的时序异常&#xff0c;有同步CDC和异步CDC。例如&#xff0c;同步时钟之间但被错误路径约束覆盖的CDC路径…

活动目录域服务

域用户能够使用[username]csk.cn进行登录。 创建一个名为“CSK”的OU&#xff0c;并新建以下域用户和组&#xff1a; sa01-sa20&#xff0c;请将该用户添加到sales用户组。 ma01-ma10&#xff0c;请将该用户添加到manager用户组。 除manager 组以外的所有用户隐藏C盘。 除…

深入理解 Linux 内核

文章目录 前言一、内存寻址1、内存地址2、硬件中的分段&#xff08;1&#xff09;段选择符 3、Linux 中的分段&#xff08;1&#xff09;Linux GDT&#xff08;2&#xff09;Linux LDT 4、硬件中的分页5、Linux 中的分页&#xff08;1&#xff09;进程页表&#xff08;2&#x…

CRLF注入漏洞、URL重定向、资源处理拒绝服务详细介绍(附实例)

目录 一、CRLF注入漏洞 漏洞简介 演示介绍 漏洞检测工具&#xff1a;CRLFuzz 二、URL重定向漏洞 漏洞简介 漏洞相关业务 演示介绍 创建重定向虚假钓鱼网站 三、WEB 拒绝服务 简介 漏洞相关业务 演示介绍 一、CRLF注入漏洞 漏洞简介 CRLF 注入漏洞&#xff0c;是因…

centos7 firewall-cmd主机之间端口转发

目录 1. firewalld1.1 firewalld守护进程1.2 控制端口/服务1.3 伪装IP1.4 端口转发 2. 案例2.1 配置ServerA2.2 安装nginx测试 &#xff08;可选&#xff09;2.3 开启端口2.4 伪装IP2.5 端口转发2.6 配置ServerB2.7 修改nginx页面显示内容2.8 访问ServerB2.9 访问ServerA 1. fi…

低代码是开发的未来,还是只能解决边角问题的鸡肋?

随着互联网行业寒冬期的到来&#xff0c;降本增效、开源节流几乎成为了全球互联网厂商共同的应对措施&#xff0c;甚至高薪酬程序员的“35岁危机”一下子似乎变成了现实。程序员的高薪吸引了各行各业的“跨界选手”&#xff0c;是编程门槛降低了吗&#xff1f;不全是&#xff0…

搭建linux邮件服务器

参考&#xff1a;企业级邮件服务器实战_哔哩哔哩_bilibili Linux 平台开源免货的邮件服务器包括: Sendmail、Postix、Omail ; 邮件服务器构成了电子邮件系统的核心&#xff0c;每个收信人都有一个位于某个邮件服务器上的邮箱(mailbox)&#xff0c;一个邮件消息的典型旅程是从…

管道命令(cut、grep、sort、wc、uniq、tee、tr、col、join、paste、expand/unexpand、split、xargs)

文章目录 管道命令(pipe)选取命令&#xff1a;cut、grepcut使用案例cut的优点缺点 grep使用案例 排序命令&#xff1a;sort、wc、uniqsort使用案例 uniq使用案例 wc使用案例 双向重定向&#xff1a;tee使用案例 字符转换命令&#xff1a;tr、col、join、paste、expandtr使用案例…

非量表数据应该如何分析?

问卷中的非量表数据应该怎么分析&#xff1f; 样本特征分析 对于非量表题的描述可以使用频数分析或者可视化图形进行描述&#xff0c;比如单选题也可以使用柱形图等进行展示&#xff0c;通过结果展示了解样本的基本情况&#xff0c;最后结合分析结果提出建议等。差异分析 除此之…

mybatis中进行时间范围查询

一 oracle数据库 数据库时间类型为DATE TO_CHAR 把日期或数字转换为字符串 TO_DATE 把字符串转换为数据库中的日期类型 TO_DATE(char, ‘格式’) TO_NUMBER 将字符串转换为数字 TO_NUMBER(char, ‘格式’) 1、入参是String类型的数据 mybatis 处理时间范围 使用TO_DATE函数…

2023个税验证Excel表

根据北京市工资计算公式制作该表格&#xff0c;用来验证每月发放工资是否有误&#xff0c;统计年度总收入等。 下载链接如下&#xff08;提升等级用&#xff09;&#xff1a; https://download.csdn.net/download/wayright/87732783 不下载&#xff0c;按照上面表格数据自己制作…

下载高清图片素材,就上这6个网站,免费还能商用

图片素材网站我已经推荐过很多了&#xff0c;今天就再给大家推荐6个高清图片素材网&#xff0c;免费下载哦~建议收藏起来。 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 我推荐过很多次的一个设计素材网站&#xff0c;除了设计类&#xff0c;还有很多自媒体可…

el-input-number 输入框添加单位

需求 使用 element-ui 的 InputNumber 控件,实现金额填写,需要在数字后面添加一个单位:元 实现效果 代码部分 <template><el-dialogclass="morendialog":title="(formData.id ? 修改 : 新增) + title":visi

没有什么比破除束缚更自由的事情了

我发现&#xff0c;我时常处于一种自我消耗、内耗的状态中&#xff0c;令我难以振作起来去改变现状。因此&#xff0c;“拒绝内耗&#xff0c;提升表达力&#xff0c;努力提升自我”成为了我必须完成的小目标。 在高中和大学的的时候&#xff0c;有一段时间&#xff0c;我曾经…

【牛客网】迷宫问题与年终奖

目录 一、编程题 1.迷宫问题 2.年终奖 二、选择题 1、将N条长度均为M的有序链表进行合并&#xff0c;合并以后的链表也保持有序&#xff0c;时间复杂度为()? 2、大小为MAX的循环队列中&#xff0c;f为当前对头元素位置&#xff0c;r为当前队尾元素位置(最后一个元素的位…