vue中使用setIntval实现地图分批渲染

项目中的问题

引用蜂鸟云地图,实现部署基站,但是数据库中的数据量很大,一下子全部渲染到地图页面,长事件运行控制台会有警告

requestAnimationFrame' handler took <N>ms

百度之后,大致了解到这个是因为画布绘制的原因,于是想要分批渲染基站到地图页面解决这个问题

在这里插入图片描述

数组分组

通过接口获取的基站数据的数组长度很大,需要分成每10个或者每20个一组的数组

		  this.stationArr = resp.data.data // 获取到的基站数据
          for (let i = 0, len = this.stationArr.length; i < len; i += 10) {
            this.resultArr.push(this.stationArr.slice(i, i + 10))
          }

经过分组后的数组结构如下
在这里插入图片描述

关于setInterval定时器

在网上查找了一些资料,大致了解到定时器要在mounted中声明,在destory中销毁,结合我的具体项目,实现了想要的效果

mounted() {
  if (this.timer) {
    clearInterval(this.timer)
  } else {
    this.timer = setInterval(() => {
      console.log('5S刷新一次数据')
    }, 5000)
  }
},
destroyed() {
  clearInterval(this.timer)
}

关于setTimeout

最一开始想到的是用setTimeout加for循环实现分批渲染,但是用模拟数据测试的时候,发现控制台直接打印了全部数据,并没有起到分批的效果,故弃用,后来不断发现原来里边还有更深层级的原理问题,这个稍后有时间再写一篇博客专门研究,找到了一个解释很细致的博客,分享到这里 https://www.cnblogs.com/Trista-l/p/7380830.html 有待更深的研究。

好了,回归正题

问题分析

添加计时器之前需要:

1.要在获取了全部基站之后,确保数据存在
2.要在地图插件引入之后,mapLoadComplete()中添加定时器,不能在mounted中添加,否则渲染的操作会报错

解决方案

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

主要代码如下:

 destroyed() {
    clearInterval(this.timer)
    // 离开路由之后断开websocket连接
    this.webSocketOnClose()
    this.websocketclose()
  },
   methods: {
    // 添加定时器
    addSetInterval() {
      this.timer = setInterval(() => {
        if (this.resultArr.length < this.times) {
          console.log('清除定时器')
          console.log(this.resultArr.length)
          console.log(this.times)
          clearInterval(this.timer)
        } else {
          // 分批部署基站
          if (this.times < this.resultArr.length) {
            this.deployBaseStation()
            console.log('渲染数组的第' + this.times + '项')
          }
          this.times++
        }
      }, 1000)
    },
    // 分批部署基站
    deployBaseStation() {
      const temporaryArr = this.resultArr[this.times]
      for (let i = 0; i < temporaryArr.length; i++) {
        tzMap.set(temporaryArr[i].baseStationNum, temporaryArr[i])
        // 遍历获取到的已部署的基站的位置信息的数组,调用addMarker方法
        this.bubbleName = temporaryArr[i].baseStationName
        this.bubbleNameX = parseInt(temporaryArr[i].positionX)
        this.bubbleNameY = parseInt(temporaryArr[i].positionY)
        this.bubbleName = '@' + temporaryArr[i].baseStationNum + '@' + this.bubbleName + '<br/>' + '(' + this.bubbleNameX + ',' + this.bubbleNameY + ')'
        this.addMarkers(this.currentGid, temporaryArr[i], this.bubbleName)
      }
    },
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值