vue实现多个echarts根据屏幕大小变化而变化实例


Posted in Javascript onJuly 19, 2020

前言

有如下页面需求:在一个页面展示多个echarts图表,并且根据屏幕大小变化而变化。

vue实现多个echarts根据屏幕大小变化而变化实例

实例

可以封装成组件使用,以增加代码复用性

// myCharts.vue
 <template>
 <div class="charts-comps" ref="charts"></div>
</template>

<script>
import echarts from 'echarts'
export default {
 name: 'myCharts',
 props: {
 type: {
  type: String,
  default: ''
 }
 },
 data () {
 return {
  resizeTimer: null,
  myChart: null
 }
 },
 methods : {
 init () {
  let myChart = echarts.init(this.$refs.charts);
  this.myChart = myChart;
  myChart.setOption({
	 xAxis: {
  type: 'category',
  boundaryGap: false,
  data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
	 },
	 yAxis: {
	  type: 'value'
	 },
	 series: [{
	  data: [820, 932, 901, 934, 1290, 1330, 1320],
	  type: 'line',
	  areaStyle: {}
	 }]
	 });
 }
 }
 mounted () {
 this.init(); // 初始化图表
 let _this = this;
 window.addEventListener('resize', function () { 
  if (_this.resizeTimer) clearTimeout(_this.resizeTimer);
  _this.resizeTimer = setTimeout(function () {
  _this.myChart.resize();
  }, 100)
 })
 }
}
</script>

<style lang="less" scoped>
 .charts-comps{
 width: 100%;
 height: 100%;
 }
</style>

这样就可以在需要用到的地方使用了

// index.vue
<template>
 <my-charts class="charts-comps" ref="charts" v-for="item in dataList" :key="item"></my-charts>
</template>

<script>
import myCharts from './myCharts'
export default {
 name: 'test',
 components: {myCharts},
 data () {
 return {
 dataList: ['test1','test2','test3','test4']
 }
 }
 }
 </script>

关键代码解析

let _this = this;
window.addEventListener('resize', function () { 
 ...
})

在myCharts组件中去监听窗口大小变化,这样可以针对每一个图表很方便的resize()重绘图表(Echarts.resize()是echarts的对图表进行重新绘制的方法)。这里使用window.addEventListener而不使用window.onresize的原因是:window.onresize绘覆盖掉前面定义的方法,而只执行最后一个,导致图表只有最后一个重绘了,而window.addEventListener避免了这个问题。

if (_this.resizeTimer) clearTimeout(_this.resizeTimer);
_this.resizeTimer = setTimeout(function () {
 _this.myChart.resize();
}, 100)

结合 函数防抖(debounce) 避免在窗口大小变化时频繁的进行图表的resize()。在处理复杂的function时可以很大限度的提高性能。实现原理就是对要执行的目标方法延时处理,设置一个定时器,当再次执行相同方法时(窗口大小变化时会被频繁的侦听到onresize),若前一个定时任务还未执行完,则清除掉定时任务,重新定时。这样当屏幕大小在100毫秒之内没有再次变化时才会对Echarts进行resize(),当然时间段可以根据自身需要设置长一点。

补充知识:vue+echarts 同页面多个echarts图表,明明宽度设置的都是100%,却只有第一个生效以及如何实现自适应

问题描述

三个echarts图表,明明宽度设置的都是100%,却只有第一个生效以及如何实现自适应

vue实现多个echarts根据屏幕大小变化而变化实例

解决办法

1.初始化时需要加上,确保操作的是最新的DOM

this.$nextTick(_ => {  
   
});

2.echarts图表自适应实现,需要在渲染图表后加上

window.addEventListener("resize", function() {        
 myChart.resize();      
});

完整如下:

vue实现多个echarts根据屏幕大小变化而变化实例

以上这篇vue实现多个echarts根据屏幕大小变化而变化实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS通过Cookie判断页面是否为首次打开
Feb 05 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
Feb 10 Javascript
微信小程序 UI与容器组件总结
Feb 21 Javascript
如何使用vuejs实现更好的Form validation?
Apr 07 Javascript
Angular.js实现动态加载组件详解
May 28 Javascript
ReactNative实现图片上传功能的示例代码
Jul 11 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
Jan 08 jQuery
基于vue-ssr的静态网站生成器VuePress 初体验
Apr 17 Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
Aug 05 Javascript
解决angularJS中input标签的ng-change事件无效问题
Sep 13 Javascript
vue鼠标悬停事件实例详解
Apr 01 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
Sep 29 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
js里面的变量范围分享
Jul 18 #Javascript
You might like
发挥语言的威力--融合PHP与ASP
2006/10/09 PHP
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
php构造函数实例讲解
2013/11/13 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
PHP attributes()函数讲解
2019/02/03 PHP
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
初识Javascript小结
2015/07/16 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
js实现简单计算器
2015/11/22 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
python二分法实现实例
2013/11/21 Python
python采集博客中上传的QQ截图文件
2014/07/18 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
python滑块验证码的破解实现
2019/11/10 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
linux面试题参考答案(7)
2012/10/29 面试题
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
项目建议书怎么写
2014/05/15 职场文书
顶岗实习协议书
2015/01/29 职场文书
2015年法制宣传月活动总结
2015/03/26 职场文书
党小组考察意见
2015/06/02 职场文书