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

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;
}
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ant-design-vue springboot开源集成框架提供了一种将ant-design-vue组件库与springboot后框架集成的解决方案。ant-design-vue是一个优秀的前UI框架,提供了丰富的组件和样式库,可以帮助开发者快速构建出美观且易于使用的用户界面。 在传统的前后分离开发中,前开发者需要自行选择UI框架,并通过RESTful接口与后进行通信。而使用ant-design-vue springboot开源集成框架,可以直接使用ant-design-vue提供的组件,无需繁琐地搭建UI,同时可以通过框架提供的API与后进行交互,简化了前后的协作流程。 具体来说,ant-design-vue springboot开源集成框架基于springboot框架和vue.js框架,提供了一套配置文件和样板代码,用于快速搭建前后集成项目。框架中已经集成了ant-design-vue的组件库,并提供了一些自定义的样式和组件,使得开发者可以更方便地使用ant-design-vue的组件来构建用户界面。 同时,框架还提供了一些配置选项和API,用于与后进行通信。开发者可以通过配置选项设置后接口的URL,然后在前代码中直接调用框架提供的API方法来发送请求和接收响应。这样,前与后之间的数据传输将更加方便和高效。 总之,ant-design-vue springboot开源集成框架是一个优秀的解决方案,可以帮助开发者快速搭建出前后集成的项目,并使用ant-design-vue提供的丰富组件来构建美观且易于使用的用户界面。有了这个框架的帮助,开发者可以更专注于业务逻辑的实现,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值