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 相关文章推荐
JavaScript中Function()函数的使用教程
Jun 04 Javascript
Javascript基础学习笔记(菜鸟必看篇)
Jul 22 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
Nov 16 Javascript
JS DOMReady事件的六种实现方法总结
Nov 23 Javascript
jquery仿ps颜色拾取功能
Mar 08 Javascript
JavaScript面向对象精要(下部)
Sep 12 Javascript
jQuery的Ajax接收java返回数据方法
Aug 11 jQuery
基于AngularJs select绑定数字类型的问题
Oct 08 Javascript
小试SVG之新手小白入门教程
Jan 08 Javascript
node中IO以及定时器优先级详解
May 10 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
Jan 11 jQuery
JavaScript实现与web通信的方法详解
Aug 07 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
咖啡的传说和历史
2021/03/03 新手入门
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
PHP 可阅读随机字符串代码
2010/05/26 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
Jquery 点击按钮显示和隐藏层的代码
2011/07/25 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
基于Javascript实现弹出页面效果
2016/01/01 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
2018/04/05 Python
Atom的python插件和常用插件说明
2018/07/08 Python
python如何读取bin文件并下发串口
2019/07/05 Python
python的列表List求均值和中位数实例
2020/03/03 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
商务日语毕业生自荐信
2013/11/23 职场文书
2014迎国庆演讲稿
2014/09/19 职场文书
公司离职证明标准范本
2014/10/05 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
Python趣味挑战之教你用pygame画进度条
2021/05/31 Python
十大最强水系宝可梦,最美宝可梦排第三,榜首大家最熟悉
2022/03/18 日漫
vue配置型表格基于el-table拓展之table-plus组件
2022/04/12 Vue.js
muduo TcpServer模块源码分析
2022/04/26 Redis