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 相关文章推荐
详解Vue的mixin策略
Nov 19 Vue.js
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
Vue+element-ui添加自定义右键菜单的方法示例
Dec 08 Vue.js
vue+element UI实现树形表格
Dec 29 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
vue-video-player 断点续播的实现
Feb 01 Vue.js
vue中axios封装使用的完整教程
Mar 03 Vue.js
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
解决vue-router的beforeRouteUpdate不能触发
Apr 14 Vue.js
vue 数字翻牌器动态加载数据
Apr 20 Vue.js
VUE递归树形实现多级列表
Jul 15 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
YB217、YB235、YB400浅听
2021/03/02 无线电
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
第十一节 重载 [11]
2006/10/09 PHP
基于mysql的bbs设计(五)
2006/10/09 PHP
php strtotime 函数UNIX时间戳
2009/01/14 PHP
Eclipse中php插件安装及Xdebug配置的使用详解
2013/04/25 PHP
PHP 用session与gd库实现简单验证码生成与验证的类方法
2016/11/15 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
vue.config.js常用配置详解
2019/11/14 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
HTML5 3D旋转相册的实现示例
2019/12/03 HTML / CSS
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
前台接待岗位职责
2013/12/03 职场文书
科学发展观活动总结
2014/08/28 职场文书
学校就业保障协议书
2019/06/24 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers