业务项目中Echarts图表组件的封装实践方案
背景:如果我们的项目是一个可视化类/营销看板类/大屏展示类业务项目,不可避免的会使用到各种图表展示。那在一个项目中如何封装一个图表组件既能够快速复用、UI统一,又可以灵活扩充Echarts的各种复杂配置项配置就变得极为重要。
封装目标
- 符合当前系统的业务UI(轴线、分隔线、配色、面积色、legend 等等)及场景
- 可基于基础配置项便捷扩充其他特殊配置项
- 可支持Echarts原生配置项,不引入过多额外的配置项!!!
封装误区
- 基于Echarts配置项封装了基础配置项组件,但是组件无法扩充额外的配置项,使用不灵活(即总是需要频繁修改封装组件)
- 在Echarts的的配置项上又封装了一层,改变了很多的配置项内容,使用成本较高(往往需要查看组件源码才知道要传入什么配置项属性)
封装思路

Vue项目实践
线图封装
<template><div v-if="notEmpty" :id="id" class="echarts-line"></div><div v-else class="echarts-empty">暂无数据</div>
</template><script>
import echarts from 'echarts';
import deepmerge from 'deepmerge';// 系统自定义区域
const colors = []; // 系统自定义的主题配色export default {name: 'EchartsLine',props: {echartsData: {type: Object,required: true,},},data() {return {lineChart: null,};},computed: {id() {return `echarts_line_${this.echartsData.id}`;},notEmpty() {return this.echartsData && this.echartsData.category.length > 0 && this.echartsData.series.length > 0;},},watch: {echartsData(value) {if (this.lineChart) {this.lineChart.setOption(this.getMergeOptions(value));this.lineChart.resize();}},},mounted() {this.init();},beforeDestroy() {window.removeEventListener('resize', this._listenerResize);},methods: {// [private] 处理轴的类型配置项,支持x轴为类目轴 | y轴为类目轴 | 双数据轴_dealAxisType(type, category) {const categoryAxis = {type: 'category',boundaryGap: true,data: category,};const valueAxis = {type: 'value',};switch (type) {case 'xCategory':return {xAxis: categoryAxis,yAxis: valueAxis,};case 'yCategory':return {yAxis: categoryAxis,xAxis: valueAxis,};case 'doubleValue':return {xAxis: {max: 'dataMax',boundaryGap: true,splitLine: {show: false,},},yAxis: {},};default:return {xAxis: categoryAxis,yAxis: valueAxis,};}},// [private] 获取线图默认配置项,系统整体统一UI_getDefaultOptions(type, category) {return {title: {subtext: '',left: 'center',textStyle: {color: '#98a6ad',fontSize: 16,fontWeight: 'normal',},},legend: {type: 'scroll',bottom: '0',},grid: {top: '30px',bottom: '50px',},color: colors,tooltip: {trigger: 'axis',axisPointer: {type: 'cross',},},...this._dealAxisType(type, category),};},// [private] 监听resize时间_listenerResize() {if (this.lineChart) {this.lineChart.resize();}},/*** [public] getMergeOptions 获取合并后的图表配置项,自定义配置项与默认配置项融合,若自定义配置项与默认配置项冲突则自定义配置项生效* 配置项合并规则:https://www.npmjs.com/package/deepmerge* @param type {String} * @param category {Array}* @param series {Array}* @param echartsConfig {Object}*/getMergeOptions({type = 'xCategory',category,series,echartsConfig = {},}) {// 01. 用户传进来的配置项和默认配置项进行合并const mergeOptions = deepmerge(this._getDefaultOptions(type, category),echartsConfig,);// 02. Series配置项合并【此处为示例】const mergeSeries = [];if (series && series.length > 0) {series.forEach((item) => {mergeSeries.push(deepmerge(item, {type: 'line',}),);});}// 03. 返回合并后的整体配置项 return {...mergeOptions,series: mergeSeries,};},// [public] 交互点,获取图表实例,用于触发图表APIgetEchartsInstance() {if (this.lineChart) {return this.lineChart;}return null;},// [public] 初始化图表init() {this.$nextTick(() => {this.lineChart = echarts.init(document.getElementById(this.id));this.lineChart.setOption(this.getMergeOptions(this.echartsData),);window.addEventListener('resize', this._listenerResize);});},},};
</script><style lang="less" rel="stylesheet/less" scoped>
.echarts-line{height: 350px;
}.echarts-empty{height: 200px;line-height: 200px;text-align: center;
}
</style>
业务调用
<v-line-chart class="echarts-item" :echarts-data="chartData"></v-line-chart>
this.chartData = {id: 'lineChart',category:['test1','test2','test3','test4'],series: [{name: '测试图表',data:[10,20,30,40],}],echartsConfig: { // 所有Echarts原生配置项放在该属性下legend: {show: false,},},
};
参考
- Echarts官网:https://echarts.apache.org/zh/index.html
- deepMerge gitHub:https://github.com/TehShrike/deepmerge
业务方案简单封装,不作为公共UI库使用,欢迎讨论其他实现方案
相关文章:
业务项目中Echarts图表组件的封装实践方案
背景:如果我们的项目是一个可视化类/营销看板类/大屏展示类业务项目,不可避免的会使用到各种图表展示。那在一个项目中如何封装一个图表组件既能够快速复用、UI统一,又可以灵活扩充Echarts的各种复杂配置项配置就变得极为重要。 封装目标 符…...
鸿蒙开发之拖拽事件
一、拖拽涉及的方法 Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)//拖拽开始.onDragStart((event: DragEvent) > {console.log(drag event onDragStartevent.getX())})//拖拽进入组件范围,需要监听onDrop配合.onDragEnter((event: DragEvent) …...
C#使用纯OpenCvSharp部署yolov8-pose姿态识别
【源码地址】 github地址:https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-Pose算法是一种基于深度神经网络的目标检测算法,用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块,通过联合检测和姿势…...
[AutoSar]基础部分 RTE 04 数据类型的定义及使用
目录 关键词平台说明一、数据类型分类二、Adt三、Idt四、Base 数据类型五、units六、compu methods七、data constraint 关键词 嵌入式、C语言、autosar、Rte 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C,C编译器HighTec (GCC) 一、数据…...
c#调试程序一次启动两个工程(多个工程)
概述 c# - Visual Studio : debug multiple projects at the same time? 以在解决方案中设置多个启动项目(右键单击解决方案,转到设置启动项目,选择多个启动项目),并为包含在解决方案(无、开始、不调试就开始)。如果您将多个项目设置为开始…...
轻松搭建企业知识库:10款必备工具推荐
随着企业知识的不断积累和团队规模的扩大,如何高效地管理和利用这些知识成为了一个重要的问题。企业知识库作为一种有效的知识管理工具,可以帮助企业将分散的知识整合在一起,方便团队成员快速查找、学习和共享。接下来就分享10款很不错的企业…...
第三天学习记录
第二天 C++随便提一提重点学习编译原理选学离散数学形式语言与自动机理论数据结构C++ 随便提一提 C++面向对象编程。与强调算法的过程性编程(试图使问题满足语言的过程性方法)不同。面向对象编程强调的是数据,它试图让语言来满足问题的要求。其理念是设计与问题本质特征相对…...
内核线程创建-kthread_create
文章参考Linux内核线程kernel thread详解 - 知乎 大概意思就是早期创建内核线程,是交由内核处理,由内核自己完成(感觉好像也不太对呢),创建一个内核线程比较麻烦,会导致内核阻塞。因此就诞生了工作队列以及…...
uniappVue3版本中组件生命周期和页面生命周期的详细介绍
一、什么是生命周期? 生命周期有多重叫法,有叫生命周期函数的,也有叫生命周期钩子的,还有钩子函数的,其实都是代表,在 Vue 实例创建、更新和销毁的不同阶段触发的一组钩子函数,这些生命周期函数…...
任务驱动式编程
main /** 模板代码*/#include "gd32f4xx.h" #include "systick.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include "main.h" #include "USART0.h" #include &quo…...
python数据可视化之折线图案例讲解
学习完python基础知识点,终于来到了新的模块——数据可视化。 我理解的数据可视化是对大量的数据进行分析以更直观的形式展现出来。 今天我们用python数据可视化来实现一个2023年三大购物平台销售额比重的折线图。 准备工作:我们需要下载用于生成图表的第…...
QT工具栏开始,退出
QT工具栏开始,退出 //初始化场景QMenuBar *bar menuBar();setMenuBar(bar);QMenu *startbar bar->addMenu("开始");QAction * quitAction startbar->addAction("退出");connect(quitAction , &QAction::triggered,[](){this->c…...
@Async正确使用姿势
Async注解可以使被修饰的方法成为异步方法,简单且方便,这篇文章将教你如何正确的使用它 先谈谈大多数人对Aysnc的认识: 如果直接使用Async,未指定线程池 并且 容器内也没有beanName为taskExecutor的bean,则会使…...
试除法判定质数算法总结
知识概览 质数的定义 在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者叫素数。 质数的判定——试除法 暴力算法 时间复杂度 改进算法 时间复杂度 暴力算法:时间复杂度O(n) 算法模版 bool is_pr…...
vuetify 回到顶部
参考链接 // 回到id#app-content-container 的dom节点顶部 onScroll() {const ele document.querySelector(#app-content-container)// this.$vuetify.goTo(0, duration)this.$vuetify.goTo(#app-content-container, { container: ele })},...
Socket与TCP的关系
前言 相信大家对于TCP已经非常熟悉了,学习过计算机网络的同学对于它的连接和断开流程应该已经烂熟于心了吧。 那么Socket是什么? Socket是应用层与TCP/IP协议簇通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是…...
RKE安装k8s及部署高可用rancher之证书私有证书但是内置的ssl不放到外置的LB中 4层负载均衡
先决条件# Kubernetes 集群 参考RKE安装k8s及部署高可用rancher之证书在外面的LB(nginx中)-CSDN博客CLI 工具Ingress Controller(仅适用于托管 Kubernetes) 创建集群k8s [rootnginx locale]# cat rancher-cluster.yml nodes:- …...
使用爬虫爬取热门电影
文章目录 网站存储视频的原理M3U8文件解读网站分析代码实现 网站存储视频的原理 首先我们来了解一下网站存储视频的原理。 一般情况下,一个网页里想要显示出一个视频资源,必须有一个<video>标签, <video src"xxx.mp4"&…...
【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果
文章目录 前言开始完结 前言 添加程序摇摆和摆动是为任何FPS游戏添加一些细节的非常简单的方法。但是并不是所以的模型动画都会配有武器摆动动画效果,在本文中,将实现如何使用一些简单的代码实现武器摇摆和摆动效果,这比设置动画来尝试实现类…...
C语言基础知识(6):UDP网络编程
UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。 1.UDP协议的主要特点: …...
需要控制重复点击按钮的通用方法
如图所示 在需要控制重复点击的地方使用通用方法去控制 省时省力 比用传统的分页定时器更方便...
SOONet模型Python入门实践:用10行代码实现视频片段搜索
SOONet模型Python入门实践:用10行代码实现视频片段搜索 你是不是也遇到过这种情况:手里有一段很长的视频,想快速找到某个特定场景,比如“主角第一次出场的时候”或者“那个爆炸的镜头”,结果只能手动拖进度条…...
如何用baidupankey解决百度网盘提取码获取难题
如何用baidupankey解决百度网盘提取码获取难题 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 引言:被提取码困住的日常 "又要找提取码?"小张盯着电脑屏幕上的百度网盘分享链接,…...
Qt 5.14.2下MQTT开发全攻略:从源码编译到实战应用(附完整代码)
Qt 5.14.2下MQTT开发全流程实战指南 在物联网应用开发中,MQTT协议因其轻量级和高效性成为设备通信的首选方案。对于使用Qt框架的开发者而言,将MQTT集成到项目中可以构建出功能强大的跨平台物联网应用。本文将深入探讨在Windows平台上使用Qt 5.14.2进行MQ…...
云原生图书馆管理系统架构设计:基于SaaS的一站式解决方案与实战案例分析
某中学图书馆数字化改造实战:传统Excel管理迁移至云端系统,借还效率提升300%,系统响应时间降低至200ms以内一、背景:传统图书馆管理的痛点分析1.1 技术债务积累在数字化转型的过程中,许多中小型学校图书馆依然停留在传…...
QwQ-32B多模态应用实践:文本与图像联合处理
QwQ-32B多模态应用实践:文本与图像联合处理 最近在折腾AI模型的时候,发现很多朋友对多模态应用特别感兴趣。所谓多模态,简单说就是让AI能同时理解文字和图片,甚至还能把两者结合起来处理。这听起来挺酷的,但实际操作起…...
百度地图API实战:5分钟搞定JS坐标系转换(wgs84转bd09ll避坑指南)
百度地图坐标系转换实战:从原理到避坑的全方位指南 第一次在项目里集成百度地图时,我盯着屏幕上偏移了500多米的标记点愣了半天——明明从GPS设备获取的经纬度坐标完全正确,为什么在地图上显示的位置却差之千里?这个困扰无数开发者…...
丹青识画部署教程:Nginx反向代理+HTTPS保障书法API安全
丹青识画部署教程:Nginx反向代理HTTPS保障书法API安全 1. 引言:当AI艺术遇见生产环境 想象一下,你开发了一个能看懂画作、还能用行草书法题跋的AI应用。它优雅、智能,充满了东方美学韵味。但当你准备把它开放给更多人使用时&…...
WebLogic T3协议漏洞实战:5分钟搞定ConnectionFilterImpl配置(附常见问题排查)
WebLogic T3协议安全加固实战:ConnectionFilterImpl配置与深度防御指南 1. 漏洞背景与防御必要性 WebLogic作为企业级Java应用服务器,其专有的T3协议长期存在反序列化漏洞风险。攻击者通过构造恶意T3协议数据包,可在未授权情况下实现远程代码…...
别再只会用高德百度了!这7种专业地图(附GIS工具推荐)帮你搞定数据分析
7种专业地图与GIS工具实战指南:从用户分布到物流优化的全场景解决方案 打开手机地图应用查看路线,可能是大多数人对地理数据的唯一接触。但当你需要分析千万级用户的区域活跃度、规划全国物流网络或评估新店选址时,高德百度提供的标准化地图就…...
