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中通过render函数给子组件设置ref操作
Nov 17 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
vuex的使用步骤
Jan 06 Vue.js
Vue实现多页签组件
Jan 14 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
vue实现锚点定位功能
Jun 29 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
vue选项卡切换的实现案例
Apr 11 Vue.js
ant design vue的form表单取值方法
Jun 01 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中文件下载功能实现超详细流程分析
2012/06/13 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
2019/01/10 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
理解Javascript_08_函数对象
2010/10/15 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
python 字典中文key处理,读取,比较方法
2018/07/06 Python
tensorflow更改变量的值实例
2018/07/30 Python
numpy和pandas中数组的合并、拉直和重塑实例
2019/06/28 Python
浅谈Python 递归算法指归
2019/08/22 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
期中考试后的反思
2014/02/08 职场文书
母校寄语大全
2014/04/10 职场文书
学校创先争优活动总结
2014/08/28 职场文书
运动会加油稿100字
2014/09/19 职场文书
英文慰问信范文
2015/03/24 职场文书