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 相关文章推荐
如何设置iframe高度自适应在跨域情况下的可用方法
Sep 06 Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 Javascript
JS中的异常处理方法分享
Dec 22 Javascript
jQuery的cookie插件实现保存用户登陆信息
Apr 15 Javascript
Node调试工具JSHint的安装及配置教程
May 27 Javascript
使用jQuery获得内容以及内容的属性
Feb 26 Javascript
jQuery实现右下角可缩放大小的层完整实例
Jun 20 Javascript
js添加千分位的实现代码(超简单)
Aug 01 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
Jan 11 Javascript
JavaScript数组操作详解
Feb 04 Javascript
jQuery实现的简单对话框拖动功能示例
Jun 05 jQuery
在vue-cli3中使用axios获取本地json操作
Jul 30 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
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
浅谈JavaScript 标准对象
2016/06/02 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
JS实现拼图游戏
2021/01/29 Javascript
js实现盒子拖拽动画效果
2020/08/09 Javascript
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
Python数组并集交集补集代码实例
2020/02/18 Python
python实现简单颜色识别程序
2020/02/19 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
python 实现性别识别
2020/11/21 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
python热力图实现简单方法
2021/01/29 Python
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
个人自我鉴定范文
2013/10/04 职场文书
大学军训自我鉴定
2013/12/15 职场文书
教师远程培训感言
2014/03/06 职场文书
一年级学生期末评语
2014/04/21 职场文书
授权委托书样本
2014/09/25 职场文书
党支部承诺书
2015/01/20 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript