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+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 Vue.js
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 Vue.js
vue实现轮播图帧率播放
Jan 26 Vue.js
vue 中this.$set 动态绑定数据的案例讲解
Jan 29 Vue.js
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
Vue如何实现组件间通信
May 15 Vue.js
vue实现同时设置多个倒计时
May 20 Vue.js
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
vue特效之翻牌动画
Apr 20 Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 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
php 运行效率总结(提示程序速度)
2009/11/26 PHP
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
PHP中英混合字符串截取函数代码
2011/07/17 PHP
php加密解密函数authcode的用法详细解析
2013/10/28 PHP
php实现文件预览功能
2017/05/23 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
对vux点击事件的优化详解
2018/08/28 Javascript
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
pandas通过索引进行排序的示例
2018/11/16 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
Python timeit模块原理及使用方法
2020/10/10 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
生产部厂长职位说明书
2014/03/03 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL