ECharts多个数据视图进行自适应大小的解决方案

项目场景:

在制作数据视图时经常会遇到多个数据视图的情况,在多个数据视图的情况下做自适应是比较麻烦的,这里就详细的分析一下该如何去制作,分享一下我的解决办法及思路。


定义 DOM 容器

这里需要注意一个地方,在定义高宽的 DOM 容器时,不能把宽度定为固定大小,或者父级也不能为固定大小,如果是固定的宽度哪怕重绘了,宽度也是一样的,所以是无法实现自适应的,一般情况下都是固定高度,然后宽度自适应

例:

<div ref="linechart" style="width:100%;height:400px;"></div>

想要实现数据视图的自适应就得先保证它的DOM容器是自适应的。

单个数据视图进行自适应

单个数据视图的解决方案就比较多了,也比较简单,就不过多的说明了

1. 使用window.onresize

let myChart = echarts.init(document.getElementById(dom))
window.onresize = function () {myChat.resize()
}

这个是通过ECharts自带的方法
myChart是你自己初始化一个 echarts,在myChart中有一个方法resize,调用这个方法可以实现重绘,实现自适应

这里拓展一下,myChat.resize()是可以自定义大小的:

myChart.resize({width: 800,height: 400
});

具体使用方法就看需求了。

这里还需要注意一个地方,就是这个方法也是可以实现多个数据视图自适应,但是比较笨一点

let myChart1 = echarts.init(document.getElementById(dom1))
let myChart2 = echarts.init(document.getElementById(dom2))
window.onresize = function () {myChat1.resize()myChat2.resize()
}

2.使用window.addEventListener添加resize方法

let myChart = echarts.init(document.getElementById(dom))
let sizeFun = function () {myChat.resize()
}
window.addEventListener('resize', sizeFun )

这个方法我也使用过,最大的问题就是当离开这个页面的时候这个函数依旧会去执行,当其他页面不存在这个DOM时则会报错,并且触发的非常频繁还需要写防抖节流器,所以不推荐使用,这里就不过多说明了。

多个数据视图进行自适应

这里分享一下我的思路:

1.通过父子传值

我是先用一个父组件,然后将这些视图分成一个个的子组件,在父组件监听浏览器的事件,当窗口大小改变之后把一个定义好的值(我这里用的是resize:true)传给子组件,子组件接收到时候在执行重绘。
具体代码就不展示了,因为就是一个父子传值的问题也比较简单,主要是分享一下解决方案

2.通过封装

这个是我目前使用的方法,但是这个方法存在一定的局限性,就是先要确定需求,保证使用的数据视图是差不多的,比如都使用到折线图,柱状图,这种相似的数据视图
在这里插入图片描述
我这里全部使用的就是折线面积图,当点击某个端点时则切换显示该字段的明细。

在这里插入图片描述

还有可以切换柱状图

在这里插入图片描述
数据视图

在这里插入图片描述
这里说一下为什么这样做:

  1. 使用过ECache都知道,这个组件的代码量比较大,尤其是在多个数据视图的情况下,代码冗余量非常多。
  2. 因为我封装好了,需要修改时只需要修改封装的组件,降低维护成本
  3. 后续在需要制作时直接调用即可

具体如何封装我会在后续发布
通过封装我们就可以非常简单的解决这个自适应的问题了。

      option = option1;option && myChart.setOption(option);//根据窗口的大小变动图表 --- 重点let listener = function(){myChart.resize()}EleResize.on(chartDom,listener)

EleResize

这个JS是我在网上找到的一个ECharts图表自适应的JS

// ECharts图表自适应JS
var EleResize = {_handleResize: function (e) {var ele = e.target || e.srcElementvar trigger = ele.__resizeTrigger__if (trigger) {var handlers = trigger.__z_resizeListenersif (handlers) {var size = handlers.lengthfor (var i = 0; i < size; i++) {var h = handlers[i]var handler = h.handlervar context = h.contexthandler.apply(context, [e])}}}},_removeHandler: function (ele, handler, context) {var handlers = ele.__z_resizeListenersif (handlers) {var size = handlers.lengthfor (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._handleObjectLoadobj.type = 'text/html'ele.appendChild(obj)obj.data = 'about:blank'return obj},_handleObjectLoad: function () {this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize)}
}
if (document.attachEvent) { // ie9-10EleResize.on = function (ele, handler, context) {var handlers = ele.__z_resizeListenersif (!handlers) {handlers = []ele.__z_resizeListeners = handlersele.__resizeTrigger__ = eleele.attachEvent('onresize', EleResize._handleResize)}handlers.push({handler: handler,context: context})}EleResize.off = function (ele, handler, context) {var handlers = ele.__z_resizeListenersif (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_resizeListenersif (!handlers) {handlers = []ele.__z_resizeListeners = handlersif (getComputedStyle(ele, null).position === 'static') {ele.style.position = 'relative'}var obj = EleResize._createResizeTrigger(ele)ele.__resizeTrigger__ = objobj.__resizeElement__ = ele}handlers.push({handler: handler,context: context})}EleResize.off = function (ele, handler, context) {var handlers = ele.__z_resizeListenersif (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} 

将这个JS导入到页面中就可以直接使用了。

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

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

相关文章

mac openssl 版本到底怎么回事 已解决

在mac 安装node多版本的时候&#xff0c;有可能把原有的 openssl1.1 版本 直接要再一次升级了&#xff0c;无奈的 php环境 编译器是 openssl 1.1 还是 3.0 &#xff0c;今天来个底朝天的找问题。 brew search openssl 有安装 三个版本。 但是错误提示 是第二个版本。 brew …

B058-SpringBoot

目录 springboot概念与作用入门案例springboot运行方式热部署配置文件Profile多环境支持整合测试-springboot-testSpringboot-web1.返回json数据2.返回页面&#xff08;模板技术&#xff09;thymeleaf1.导入thymeleaf依赖2.模板文件3.controller4.启动类 SSM整合1.导包2.项目目…

【动态规划】动态规划经典例题 力扣牛客

文章目录 跳台阶 BM63 简单跳台阶扩展 JZ71 简单打家结舍 LC198 中等打家劫舍2 LC213中等最长连续递增序列 LC674 简单乘积最大子数组LC152 中等最长递增子序列LC300 中等最长重复子数组LC718最长公共子串NC BM66最长公共子序列LC1143 中等完全平方数LC279零钱兑换 LC322 中等单…

QT的ui设计中改变样式表的用法

在QT的ui设计中,我们右键会弹出一个改变样式表的选项,很多人不知道这个是干什么的。 首先我们来看下具体的界面 首先我们说一下这个功能具体是干嘛的, 我们在设置很多控件在界面上之后,常常都是使用系统默认的样式,但是当有些时候为了美化界面我们需要对一些控件进行美化…

【数据结构】链表与LinkedList

作者主页&#xff1a;paper jie 的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

小程序编译器性能优化之路

作者 | 马可 导读 小程序编译器是百度开发者工具中的编译构建模块&#xff0c;用来将小程序代码转换成运行时代码。旧版编译器由于业务发展&#xff0c;存在编译慢、内存占用高的问题&#xff0c;我们对编译器做了一次大规模的重构&#xff0c;采用自研架构&#xff0c;做了多线…

链表经典面试题(一)

面试题 1.反转链表的题目2.反转链表的图文分析3.反转链表的代码实现 1.反转链表的题目 2.反转链表的图文分析 我们在实现反转链表的时候,是将后面的元素变前面&#xff0c;前面的元素变后面&#xff0c;那么我们是否可以理解为&#xff0c;用头插法的思想来完成反转链表呢&…

Cannot download sources:IDEA源码无法下载

问题 Swagger的相关包&#xff0c;无法看到注释&#xff1b; 在class文件的页面&#xff0c;点击下载源码&#xff0c;源码下载不了&#xff0c;IDEA报下面的错误。 报错 Cannot download sources Sources not found for: io.swagger.core.v3:swagger-annotations:2.2.9 解决…

读者写者问题—内含408真题

读者写者问题—含408 一、问题描述 一个数据问价或记录可以被多个进程共享&#xff0c;我们把只读该文件的进程称为“读者进程”&#xff0c;其他进程为“写者进程”。允许多个进程同时读一个共享对象&#xff0c;但不允许一个写者进程和其他写者进程或读者进程同时访问共享对…

点亮一个LED+LED闪烁+LED流水灯——“51单片机”

各位CSDN的uu们好呀&#xff0c;这是小雅兰的最新专栏噢&#xff0c;最近小雅兰学习了51单片机的知识&#xff0c;所以就想迫不及待地分享出来呢&#xff01;&#xff01;&#xff01;下面&#xff0c;让我们进入51单片机的世界吧&#xff01;&#xff01;&#xff01; 点亮一个…

Linux基础命令汇总

用户管理 su 切换用户&#xff1a;su 用户名 logname 显示当前用户的登录用户名&#xff1a;logname useradd 创建用户&#xff1a;useradd 用户名创建用户时指定用户的主组&#xff1a;useradd -g 组名 用户名 usermod 添加附属组&#xff1a;usermod -G 组…

2023年8月嵌入式项目开发专题总汇

一、前言 本文介绍基于嵌入式系统和C语言开发的系列项目。这些项目涵盖了多个领域&#xff0c;从自动化控制到游戏开发&#xff0c;从计算机网络到物联网应用。通过这些项目的开发过程&#xff0c;将深入探讨各种技术和解决方案&#xff0c;并分享相关经验和知识。 在本文中&…

cesium 雷达扫描 (线行扩散效果)

cesium 雷达扫描 (线行扩散效果) 1、实现方法 使用ellipse方法加载圆型,修改ellipse中material方法来实现效果 2、示例代码 2.1、 <!DOCTYPE html> <html lang="en"><head><<

分类预测 | Matlab实现BES-ELM秃鹰搜索算法优化极限学习机分类预测

分类预测 | Matlab实现BES-ELM秃鹰搜索算法优化极限学习机分类预测 目录 分类预测 | Matlab实现BES-ELM秃鹰搜索算法优化极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 Matlab实现BES-ELM秃鹰搜索算法优化极限学习机分类预测&#xff08;完整源码和数…

【CVPR 2023】DSVT: Dynamic Sparse Voxel Transformer with Rotated Sets

文章目录 开场白效果意图 重点VoxelNet: End-to-End Learning for Point Cloud Based 3D Object DetectionX-Axis DSVT LayerY-Axis DSVT Layer Dynamic Sparse Window AttentionDynamic set partitionRotated set attention for intra-window feature propagation.Hybrid wind…

优维低代码实践:应用级配置

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

[NOIP2012 提高组] 开车旅行

[NOIP2012 提高组] 开车旅行 题目描述 小 A \text{A} A 和小 B \text{B} B 决定利用假期外出旅行&#xff0c;他们将想去的城市从 $1 $ 到 n n n 编号&#xff0c;且编号较小的城市在编号较大的城市的西边&#xff0c;已知各个城市的海拔高度互不相同&#xff0c;记城市 …

亚信科技AntDB数据库 高并发、低延迟、无死锁,深入了解AntDB-M元数据锁的实现

AntDB-M在架构上分为两层&#xff0c;服务层和存储引擎层。元数据的并发管理集中在服务层&#xff0c;数据的存储访问在存储引擎层。为了保证DDL操作与DML操作之间的一致性&#xff0c;引入了元数据锁&#xff08;MDL&#xff09;。 AntDB-M提供了丰富的元数据锁功能&#xff0…

Koa处理请求数据

在开发中&#xff0c;后端接收到请求参数后&#xff0c;需要解析参数。请求分为很多种类型&#xff0c;比如常见的get和post。 请求参数 Koa本身可以解析get请求参数&#xff0c;不能解析post请求参数。例如&#xff1a; router.get(/api/get/userInfo, async (context) >…

新手--安装好Quartus II13.0(带modelsim集成包)并用Quartus II搭建一个工程

前言 今天是国庆节&#xff0c;我们正式来学习Quartus II13.0软件的安装与使用。学习verilog与学习C语言都是学习一门语言&#xff0c;那么学习一门语言&#xff0c;光看理论不敲代码绝对是学习不好的。要用verilog语言敲代码&#xff0c;就要像C语言那样搭建起语言的编译环境&…