多个数据webSocket推送太快导致前端渲染卡顿问题优化

作者代码写的不怎么样,谅解!主要思路就是把websocket接收到的数据用一个数组暂存起来,达到一定数量一起修改统一渲染,可根据项目数据推送数据的速度适当调解数组大小,然后再加了一个可能一段时间内都到不到数组达标渲染数量,就使用定时器直接做渲染,防止数据不变化了

data() {
  return {
    tempDataWsList: [], // 存放临时ws数据数组
    list: [], // 页面上的列表
    listCopy: [], // 深拷贝的初始化列表数据,用于统一渲染
  }
}
methods: {
  ...
  // websocket接收数据的方法
  onMessage(data) {
    if (data.data) {
      // 将Json字符串转译
      const dataWs = JSON.parse(data.data);
      // 将转译后的数据推入临时ws数据数组中
      this.tempDataWsList.push(dataWs);
      // 有ws数据就关闭定时器
      clearTimeout(this.wsTimeout);
      // 做缓存渲染,将ws接收到的数据放到数组,满10个就统一渲染
      if (this.tempDataWsList.length == 10) {
        this.handleList();
      } else {
        // 如果最后一个接收后1秒钟内不能满足10个,则直接渲染
        this.wsTimeout = setTimeout(() => {
          this.handleList();
        }, 1000);
      }
    }
  },

  // 操作数据渲染
  handleList() {
    // 循环临时ws数据数组
    this.tempDataWsList.forEach(temp => {
      // 循环深拷贝的初始化列表数据
      this.listCopy.forEach(item => {
        // 循环判断列表对应ws数据id,修改深拷贝列表上的值
        item.pointDetails.forEach(item1 => {
          if (item1.id == temp.detailsId) {
            item1.value = temp.realVal;
          }
        });
      });
    });
    // 清空临时ws数据数组
    this.tempDataWsList = [];
    // 将修改的列表数据赋值给页面渲染
    this.list = this.listCopy;
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_42627850/article/details/128964300