大屏项目的优化性能(很全)--Vue+echarts+轮播定时出现的白屏,卡死,

2023-11-06

1. 问题表现
        项目是轮播一个页面多个组件的形式来展示页面中的图表,模板。一个组件模板当中有3-4个图表,定时轮播接口。但是页面经常白屏,且占用工控机的CPU资源消耗太大,固来优化性能


2.项目自测

chrome的调试工具测试发现CPU占用特别高,了解了echarts的原理后发现是每一个图例在没有数据的时候它会创建一个定时器去渲染气泡,echarts图例是销毁了,这个echarts的实例还在内存当中,它的气泡渲染定时器也还在运行,并且定时器用的也有坑,setInterval 是一个宏任务,如果在它前面有很多任务或者某个任务等待时间较长比如网络请求报错等,那么这个定时器的执行时间和我们预定它执行的时间可能并不一致。


3.问题解决

(1)将setInterval 改成 setTimeout 递归形式,用setTimeout模拟setInterval行为,即:

  mounted() {
    this.getOverview();
  },
  methods: {
    getOverview() {
      this.timer = setTimeout(() => {
        this.getOverview();
      }, 30000);
    },
  },
  data() {
    return {
      timer: null,
    };
  },

(2)用 svg 为图表的渲染器,官方解释是

 做法:

chart = this.$echarts.init(this.$el, "null", {
        renderer: "svg",
 });

第一个参数为你的实例容器,第二个为主题的配置对象,第三个默认是Canvas,这里我们选择SVG渲染,因为数据不多,项目不大。

并且echarts 实例不要挂载在 vue 实例上,就是不放在data中,不然,每次构建响应式数据对象,都会耗费很多的时间和空间,而且chart实例赋值在this上。(this对象一直存在不会被回收)

(3) 清空 echart 实例

        因为我是单页面一直轮播,所以一直没有去关注销毁或清空的事件,但是关乎到有时用户退出登录或者重新加载方面,突然想到还有个登录页。而且搜索相关资料发现就算组件销毁了,图表实例依然还在缓存里,前面所说的气泡渲染定时器也还在运行 。

第一种方案是在init之前先判断echarts实例是否存在在选择是否创建


if (chart == undefined) {
    chart = echarts.init(document.getElementById(dom));
}

        但是这个我的项目用的图表都是组件化,每个轮播组件用的图表都是组件,所以不会重复init,所以我选择在下次赋值前清空缓存(我的项目是轮播到当前组件就调用接口给图表重新赋值)

// 设置true清空echart缓存
        chart.clear();
        chart.setOption(options, true);

         看了大部分人解决方案是beforeDestroy中释放页面的chart资源,有人用的是dispose()销毁图表的方法,可能会报相关resize方法的错,建议clear()方法

        还有就是而且页面刷新页面时,并不会走vue的相关生命周期,所以也并不会销毁或清空之前的图表实例,建议监听页面刷新事件来执行方法

methods: {
   chart(){
     this.$destroy();
   }
}

mounted(){
	window.addEventListener('beforeunload', this.chart);
}

beforeDestroy() {
  if (!chart) {
    return;
  }
  // 清空 beforeunload 事件处理函数
  window.removeEventListener('beforeunload', this.clearChart);
  // 或者chart.clear();
  chart = null;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大屏项目的优化性能(很全)--Vue+echarts+轮播定时出现的白屏,卡死, 的相关文章

随机推荐

  • 网络--tcp协议中控制位

    网络层中的tcp协议 首先看一下tcp的报头信息 其中其余的好理解 但是它是拥有了6个控制位的 说明了此次报文段的性质 紧急URG URGent 当URG等于1时 表明紧急指针字段有效 它告诉系统此报文段中有紧急数据 应尽快传送 相当于高优
  • MySQL 索引 详解(保姆级教程)

    一 索引概述 索引是帮助 MySQL 高效获取数据的数据结构 有序 在数据之外 数据库系统还维护着满足特定查找算法的数据结构 这些数据结构以某种方式引用 指向 数据 这样就可以在这些数据结构上实现高级查询算法 这种数据结构就是索引 二 索引
  • STM32学习日记--Day3--PWM驱动LED灯

    PWM基本结构 主函数 include stm32f10x h Device header include Delay h include OLED h include PWM h uint8 t i int main void OLED
  • Java --- JVM堆的概述与内存细分

    目录 一 堆 二 堆的内存细分 一 堆 1 一个JVM实例只存在一个堆内存 堆也是Java内存管理的核心区域 2 Java堆区在JVM启动的时候即被创建 其空间大小也就确定了 是JVM管理的最大一块内存空间 堆内存的大小是可以调节的 参考代
  • 典型MOSFET制造工艺流程示意图

    复旦大学姜玉龙的课程 半导体器件 截图 图中有的红点是鼠标 下面将阐述这个工艺过程 硅片基底 假设厚度800um 实际上只有上表层有用大概10um厚度左右 然后填充氧化物 用来隔离 然后进行阱注入 可以选择两边分别注入N阱或者P阱 从而隔开
  • 刷题网站

    力扣 这个网站中题解真的是非常丰富 适合新手刷题 不会的可以看看题解 而且适合于练习各种常见的算法 面试求职 英文网址 https leetcode com 中文网址 https leetcode cn com 最近在备战蓝桥杯的时候发现一
  • Python的递归深度问题

    1 Python默认的递归深度是有限制的 当递归深度超过默认值的时候 就会引发RuntimeError 理论在997 2 解决方法 最大递归层次的重新调整 解决方式是手工设置递归调用深度 import sys sys setrecursio
  • 可动态增加、删除的全局蒙灰弹层

    import React Component from react import PropTypes from prop types import assign from object assign import from lodash i
  • 如何编写 Kubernetes 的 YAML 文件?

    声明 本文出自 CNCF 帖子最初发表于 ARMO 由研发副总裁兼联合创始人 Ben Hirschberg 撰写 已获得授权 感谢 山河已无恙 整理 西狩xs 校对 以下为翻译全文 分享给大家 尽管 Kubernetes 越来越受欢迎 但它
  • 如何使用OpenCV保存.mp4格式文件

    fourcc cv2 VideoWriter fourcc mp4v out cat cv2 VideoWriter save mp4 fourcc 24 640 360 True 保存位置 格式 out cat write image 保
  • ElementUI 之el-table-column 格式化属性(日期格式化)

    如果想对表格某一列的内容格式化 性别 日期显示 可用 formatter 属性 实战 日期显示 在method 定义formatDate 方法 formatDate row column 获取单元格数据 let data row colum
  • 数组和指针笔试题解析之【指针】

    目录 笔试题1 笔试题2 笔试题3 笔试题4 笔试题5 笔试题6 笔试题7 笔试题8 笔试题1 int main int a 5 1 2 3 4 5 int ptr int a 1 printf d d a 1 ptr 1 return 0
  • 微信小程序项目源码-50套微信小程序毕业设计的项目实战(附源码+论文+演示视频)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 今天给大家分享50 基于微信小程序的毕业设计 这些项目都经过精心挑选 涵盖了不同的实战主题和用例 可做毕业设计和课程设计参考 除了源码 对于大部分项目实现的功能都有相应的介绍 并且配有
  • docker基础篇-----02-----docker帮助命令、镜像命令、容器命令

    参考文章 学习笔记 尚硅谷周阳老师的Docker教程学习笔记 一 Docker常用命令 1 docker帮助命令 1 查看docker版本 docker version 2 查看docker信息 docker info 3 docker帮助
  • DeFi进化之路

    DeFi经过两年多的蛰伏 在2020年夏天爆发 本文谨代表作者个人观点 不代表火星财经立场 该内容旨在传递更多市场信息 不构成任何投资建议 来源 蓝狐笔记 DeFi经过两年多的蛰伏 在2020年夏天爆发 从6月中旬到现在 仅仅过了三个月的时
  • 【Chatgpt 公众号问答】使用python编写 带上下文 多端部署实现

    效果展示 功能列 多端部署 有多种部署方式可选择且功能完备 目前已支持个人微信 微信公众号和企业微信应用等部署方式 基础对话 私聊及群聊的消息智能回复 支持多轮会话上下文记忆 支持 GPT 3 GPT 3 5 GPT 4模型 语音识别 可识
  • SpringBoot实现短信登陆功能

    大家好我是小羽 这段时间做项目用到了手机短信登陆的功能 在此记录一下 欢迎大家来关注我的微信公众号Java小羽 一 注册阿里云账号 登陆阿里云 直接用支付宝扫码就可以登陆注册 点击控制台 3 点击侧边栏 4 搜索短信服务 5 选择类型 6
  • window.location进行页面重定向

    host 和 hostname 的区别 host将包括端口号 而hostname只返回主机名 更改 URL 属性 开始 https segmentfault com window location pathname tidbits 设置 p
  • electerm可用的 类termius风格主题

    目录 介绍 UI主题配置 终端背景图片 注意 最终效果 介绍 electerm可用的termius风格主题及背景图片 资源来自https github com Hope IT Works electerm theme termius UI主
  • 大屏项目的优化性能(很全)--Vue+echarts+轮播定时出现的白屏,卡死,

    1 问题表现 项目是轮播一个页面多个组件的形式来展示页面中的图表 模板 一个组件模板当中有3 4个图表 定时轮播接口 但是页面经常白屏 且占用工控机的CPU资源消耗太大 固来优化性能 2 项目自测 chrome的调试工具测试发现CPU占用特