完美解决vue 中多个echarts图表自适应的问题


Posted in Javascript onJuly 19, 2020

看代码吧~

<div class="echarts">
<IEcharts :option="bar" ref="echarts"></IEcharts>
 
</div>
mounted () {
   this.selfAdaption ()
  },
  methods: {
   //echarts自适应
   selfAdaption () {
    const self = this;
    setTimeout(() => {
     window.onresize = function () {
      self.$refs.echarts.resize()
     }
    }, 10)
   }
}

上面这段代码在出现多个echarts图表时只有一个图表自适应,修改了一下

<div class="echarts">
<IEcharts :option="bar" ref="echarts"></IEcharts>
</div>
 
mounted () {
   this.selfAdaption ();
},
methods: {
  //echarts自适应
  selfAdaption () {
   let _this = this;
   setTimeout(() => {
     window.addEventListener('resize', function () {
      _this.$refs.echarts.resize();
     })
   }, 10)
  }
 }

------------------------------------------------------------------------------------------------------------------------------------

在vue中引入多个echart图表时

<div class="linebox">
 
<div :id="id" style="width:100%; height:100%;" ref="Echart"></div>
 
</div>
methods: {
  init(){
  const self = this;//因为箭头函数会改变this指向,指向windows。所以先把this保存
  setTimeout(() => {
    window.addEventListener('resize', function() {
       self.chart = self.$echarts.init(self.$refs.Echart);
       self.chart.resize();
    })
   },10)
  }
}

补充知识:vue项目在同一页面中引入多个echarts图表 ,并实现封装,自适应和动态数据改变

vue-Echarts

公司最近做项目需要用到图表,以前是使用echarts,现在也是用这个,没什么好纠结的! 但是最近发现以前每次做图表之类的都没有封装,每次做图表都要从新去配置之类的,写了好多重复代码,感觉很累啊,所以自己把图表封装成子组件使用,代码工作量减轻了很多,而且子组件使用了数据进行监听和图表自适应屏幕大小,这样以后会方便很多了!

当然公司的项目肯定不能发出来了,我会做个简单的demo出来

先截个图吧!

完美解决vue 中多个echarts图表自适应的问题

其实我也未作什么太复杂的工作,以前工作中,页面中要2个图表,我在methods:{}中写两个方法配置之类的,类似这样子:

完美解决vue 中多个echarts图表自适应的问题

好了,首先第一步,使用echarts当然要引用了

1. vue 项目中 引用echarts

cnpm install echarts -S

执行完毕后再 main.js中引入

完美解决vue 中多个echarts图表自适应的问题

因为是pc端的项目,用了element ui (不重要),引入之后就可以在全局使用了,之前对这个不是很懂,每个要图表页面都引入echarts,就像这个样子:

完美解决vue 中多个echarts图表自适应的问题

使代码写的乱七八糟的,现在在全局引用了,就不需要在每个用图表的页面中引入了

2. 父子组件中使用图表,现在我做的这个页面把他分成两个部分,这个页面整体为父,两个图表为子组件,这样子

完美解决vue 中多个echarts图表自适应的问题

1.先看下父组件代码,样式类的请忽视

完美解决vue 中多个echarts图表自适应的问题

import linegraph from '@/components/linegraph.vue'
export default {
data(){
return{
notAccess:false,
ChartLineGraph2:null,
option:{
  title: {
    text: '全年产量趋势图',
    left: 'center'
  },
  tooltip: {
    trigger: 'item',
    formatter: '{a} <br/>{b} : {c}'
  },
  legend: {
    left: 'center',
    data: ['本年', '上年'],
    bottom:0
  },
  xAxis: {
    type: 'category',
    name: 'x',
    splitLine: {show: false},
    data: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月']
  },
  grid: {
    left: '1%',
    right: '2%',
    bottom: '8%',
    containLabel: true
  },
  yAxis: {
    type: 'category',
    name: 'y',
    splitLine: {show: true},
    data:['10%','20%','30%','40%','50%','60%','70%','80%','90%','100%']   
  },
  series: [
    {
      name: '本年',
      type: 'line',
      data: [0.8, 0.98, 0.96, 0.27, 0.81, 0.47, 0.74, 0.23, .69, 0.25, 0.36, 0.56]
    },
    {
      name: '上年',
      type: 'line',
      data: [1, 0.2, 0.4, 0.8, 0.16, 0.32, 0.64, 1.28, 5.6, 0.25, 0.63, 0.65, 0.12]
    },
  ]
},
option2:{
   title: {
    text: '全年设备产量对比图',
    left: 'center'
  },
  xAxis: {
    type: 'category',
    data: ['检品机1', '检品机2', '检品机3', '检品机4', '检品机5', '检品机6', '检品机7']
  },
  yAxis: {
    type: 'value'
  },
  legend: {
    left: 'center',
    data: ['本年', '上年'],
    bottom:0
  },
  grid: {
    left: '1%',
    right: '2%',
    bottom: '8%',
    containLabel: true
  },
  series: [
  {
  name: '本年',
    data: [120, 200, 150, 80, 70, 110, 130],
    type: 'bar',
    barWidth:30,
  },
  {
  name: '上年',
    data: [120, 200, 150, 80, 70, 110, 130],
    type: 'bar',
    barWidth:30,
  }]
}
   
}
},
mounted(){

},
components:{
ErrorTip,
linegraph,
}
}

这是父组件代码,两个图表不管是折线图还是柱状图都是使用 linegraph.vue这个子组件来进行的,因为我把echarts图表生成的配置项都放在了父组件里面,然后通过父组件给子组件传值实现图表生成,

3.父组件我们看完了,现在我们看下是如何封装的图表类linegraph.vue子组件,我先截图一下,然后解释:

完美解决vue 中多个echarts图表自适应的问题

这里需要注意一下这几个问题,

第一个: 父子组件传值问题 ,父组件需要传id值和配置项的值给子组件生成图表,通过vue的prop传过来的id和data(配置项) ,具体怎么传值可看父子组件传值代码或百度;

第二点: 我们首先设想这样一个场景: 当父组件的传值 option或者option2 (图表配置项),刚开始在data()里面是设置为option:null,或者是一个空的对象,或者配置项缺少数据这部分,在methods中通过ajax调用接口获取到数据然后赋值给option,例如:this.option = 一个对象,可以成图表之类的,当option值未改变时就把option=null的值传递给了子组件,这样图表生成不了,像这样

完美解决vue 中多个echarts图表自适应的问题

完美解决vue 中多个echarts图表自适应的问题

数据不能动态传值 ,数据不能动态传值! 要解决这个问题,必须用到vue watch的对象深度监听,我之前写了一篇watch,正好用上了

完美解决vue 中多个echarts图表自适应的问题

对子组件接受到的data(配置项)进行深度监听,当父组件通过ajax改变了传过来的data的值,图表将会重新渲染。

3.第三个问题

图表自适应,当屏幕大小改变时,图表也需要进行自适应,本来挺简单的东西,被我头脑转不过来,搞了一个小时,总算搞好了啊,其实之前写的就是在 子组件的 drawLineGraph()方法里面写入一个方法,这个方法

window.onresize =this.ChartLineGraph.resize;

还是出问题了,这个页面两个图表,结果只有后面的图表会自适应,前面的那个没反应???,我就蒙了,还以为自己方法写错了,真是蛋疼, 改成这样,那个this一定要注意,我就是搞错对象了,然后两个图表都可以自适应

完美解决vue 中多个echarts图表自适应的问题

好吧,这是我封装的echarts组件,没有进行ajax的对接操作,如果有问题,欢迎留言!

以上这篇完美解决vue 中多个echarts图表自适应的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js静态作用域的功能。
Dec 25 Javascript
让IE8支持DOM 2(不用框架!)
Dec 31 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
Mar 23 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
Mar 26 Javascript
select标记美化--JS式插件、后期加载
Apr 01 Javascript
iframe如何动态创建及释放其所占内存
Sep 03 Javascript
jQuery处理json数据返回数组和输出的方法
Mar 11 Javascript
深入理解vue.js双向绑定的实现原理
Dec 05 Javascript
flexslider.js实现移动端轮播
Feb 05 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
Mar 08 Javascript
深究AngularJS中$sce的使用
Jun 12 Javascript
Vue 实例事件简单示例
Sep 19 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
Jul 19 #Javascript
解决vue一个页面中复用同一个echarts组件的问题
Jul 19 #Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
Jul 19 #Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
Jul 19 #Javascript
JavaScript中reduce()的5个基本用法示例
Jul 19 #Javascript
JS中作用域以及变量范围分析
Jul 18 #Javascript
JS中的变量作用域(console版)
Jul 18 #Javascript
You might like
php cli 方式 在crotab中运行解决
2010/02/08 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
angularjs $http实现form表单提交示例
2017/06/09 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
Python 随机生成中文验证码的实例代码
2013/03/20 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
Apache,wsgi,django 程序部署配置方法详解
2019/07/01 Python
Python字符串查找基本操作代码案例
2020/10/27 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
AssertionError 跟一下那个类是 “is – a”的关系
2012/02/21 面试题
成教自我鉴定
2013/10/27 职场文书
倡议书范文
2014/04/16 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
车辆年审委托书范本
2014/09/18 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers