vue使用echarts图表自适应的几种解决方案


Posted in Vue.js onDecember 04, 2020

1.使用window.onresize

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

优点:可以根据窗口大小实现自适应

缺点:

多个图表自适应写法比较麻烦(当一个页面的图表太多时,这样写法不是很灵活);

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

多个vue页面有onresize方法时,会被覆盖;

当vue页面路由跳转到下一个页面时,上一个页面的onresize方法会继续执行,(这个时候下一个页面已经不需要onresize方法执行了,当图表过多时会造成页面卡顿)

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

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

优点:

  1. 可以根据窗口大小实现自适应;
  2. 将图表方法封装以后,只需要执行一遍就可以实现多个图表的自适应;
  3. 不会被覆盖

缺点:

  • 当vue页面路由跳转到下一个页面时,上一个页面的onresize方法会继续执行

【造成这个问题的原因是因为vue是单页面应用,echarts中的操作都是基于window,当然也可以使用window.removeEventListener在下一个页面删除绑定的方法】

3.实现在div使用onresize方法

esresize.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}

到此这篇关于vue使用echarts图表自适应的几种解决方案的文章就介绍到这了,更多相关vue使用echarts图表自适应内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
vue+element实现动态加载表单
Dec 13 Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
Vue 组件注册全解析
Dec 17 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
vuex的使用和简易实现
Jan 07 Vue.js
Vue全家桶入门基础教程
May 14 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
解读Vue组件注册方式
May 15 Vue.js
SSM VUE Axios详解
Oct 05 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
vue如何在data中引入图片的正确路径
Jun 05 Vue.js
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 #Vue.js
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 #Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 #Vue.js
对vue生命周期的深入理解
Dec 03 #Vue.js
用vue设计一个日历表
Dec 03 #Vue.js
实用的 vue tags 创建缓存导航的过程实现
Dec 03 #Vue.js
如何实现vue的tree组件
Dec 03 #Vue.js
You might like
thinkphp实现附件上传功能
2017/05/26 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
jQuery Ajax 全解析
2009/02/08 Javascript
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
如何使用python爬取csdn博客访问量
2016/02/14 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
交通事故代理词范文
2015/05/23 职场文书
详解Vue router路由
2021/11/20 Vue.js
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android