短时间内多次查询表格数据渲染问题

Posted yangal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了短时间内多次查询表格数据渲染问题相关的知识,希望对你有一定的参考价值。

需求:页面上方有许多标签,每点击一个标签或者取消一个标签都会调用接口查询数据,渲染到表格中。

问题1:当数据较多时,表格渲染的比较慢
问题2:当点击过快时,可能标签1对应的接口的返回数据1还没返回的时候,又点击了标签2,对应的接口返回的数据2返回开始渲染,数据2渲染一半时,数据1也回来了也开始渲染,导致表格渲染的数据不准确,可能只有一部分2,也可能有一部分2也有一部分1
解决1:可以先将表格的一部分数据渲染出来,然后慢慢添加,核心代码:
const chunkData = this.getChunk(objData.dataList)
let chunkStep = 0
this.tableDataObj.dataList.push(...chunkData[chunkStep])
chunkStep++
this.queryProcess = setInterval(() => {
    if (chunkData[chunkStep]) {
      this.tableDataObj.dataList.push(...chunkData[chunkStep])
      chunkStep++
    } else {
      clearInterval(this.queryProcess)
      this.queryProcess = 0
    }
}, 200)

getChunk (arr) { // 获取分隔后的数据集合
  const stepArr = [0, 0.05, 0.1, 0.3, 0.6, 1]
  const arrLen = arr.length
  return Array.from({ length: 5 }, (ignore, i) => arr.slice(Math.ceil(arrLen * stepArr[i]), Math.ceil(arrLen * stepArr[i + 1])))
}
解决2:每次点击都用一个时间戳标记,每次只渲染对应的时间戳的数据,否则返回,时间戳1 timesTamp赋值给this.lastGetTableDateTimesTamp,时间戳2timesTamp也赋值给this.lastGetTableDateTimesTamp。当时间戳1对应的数据返回时,this.lastGetTableDateTimesTamp已被修改,对应不上,直接return不再渲染数据1,只渲染数据2,核心代码:
const timesTamp = new Date()
this.lastGetTableDateTimesTamp = timesTamp
try {
    const res = await this.$http.post(url, params)
    if (this.lastGetTableDateTimesTamp !== timesTamp) {
      return
    }
}

全部代码:

//查询表格数据
async queryData (flag) {
  const timesTamp = new Date()
  this.lastGetTableDateTimesTamp = timesTamp
  this.initStatusTagsPanel()
  if (!flag) {
    this.searchwordCur = this.keyword
  }
  const url = this.api.claimCustomer.queryData
  const batch = 0
  const keyword = this.keyword
  const pageIndex = this.withPage.pageIndex
  const pageSize = this.withPage.pageSize
  const queryFields = this.queryFields
  const tags = this.tags
  const order = this.order
  //获取可见公共库
  // const publicStorageIds = this.timeAndId.IdArray
  let params = {
    batch,
    keyword,
    pageIndex,
    pageSize,
    queryFields,
    order,
    tags
    // publicStorageIds
  }
  try {
    this.loading = true
    const res = await this.$http.post(url, params)
    if (!this.haveLabel) {
      await this.getLimitTime()
    }
    if (this.lastGetTableDateTimesTamp !== timesTamp) {
      return
    }
    let objData = {}
    if (res.data && res.data.code === 200 && res.data.data) {
      objData = await common.handleData(this.timeAndId, res.data.data)
    } else {
      objData = { dataList: [] }
    }
    this.loading = false
    this.haveLabel = false
    if (objData.dataList.length) {
      if (this.queryProcess) {
        clearInterval(this.queryProcess)
        this.queryProcess = 0
      }
      //表格置空
      this.tableDataObj = {}
      this.tableDataObj.dataList = []
      //添加内容
      this.tableDataObj.pageIndex = objData.pageIndex || 0
      this.tableDataObj.pageSize = objData.pageSize || 0
      this.tableDataObj.total = objData.total || 0
      const chunkData = this.getChunk(objData.dataList)
      let chunkStep = 0
      this.tableDataObj.dataList.push(...chunkData[chunkStep])
      chunkStep++
      this.queryProcess = setInterval(() => {
        if (chunkData[chunkStep]) {
          this.tableDataObj.dataList.push(...chunkData[chunkStep])
          chunkStep++
        } else {
          clearInterval(this.queryProcess)
          this.queryProcess = 0
        }
      }, 200)
    } else {
      this.tableDataObj = objData
    }
  } catch (e) {
    this.common.handleError(e, this)
    this.loading = false
    this.haveLabel = false
  }
},
//拆分数据
getChunk (arr) { // 获取分隔后的数据集合
  const stepArr = [0, 0.05, 0.1, 0.3, 0.6, 1]
  const arrLen = arr.length
  return Array.from({ length: 5 }, (ignore, i) => arr.slice(Math.ceil(arrLen * stepArr[i]), Math.ceil(arrLen * stepArr[i + 1])))
},

以上是关于短时间内多次查询表格数据渲染问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS解决按钮短时间内多次点击只触发一次事件方法

多次调用片段 onCreateView

尝试在短时间内连续第二次运行 SQL 查询时 Java 挂起

iOS解决按钮短时间内多次点击只触发一次事件方法

vue directive自定义指令防止按钮在短时间内多次点击

片段内的表格布局