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

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

问题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])))
},

原文地址:https://www.cnblogs.com/yangAL/p/10525042.html

时间: 2024-11-03 15:08:47

短时间内多次查询表格数据渲染问题的相关文章

jquery.jqgrid 重新加载表格数据

〇.目的 select下拉框选择选择某选项之后,DataGrid数据表格也能随之变动. 一.使用的技术 1.后 Java.Spring MVC 2.前 JQuery-select2,jquery.jqgrid 二.代码-前 1 下拉框 2 <#form:select id="contractId" path="contractId" items="${contractList}" itemLabel="contractCode&q

angularjs学习笔记--$http、数据渲染到表格、路由、依赖注入、provider

1—$http 可以从服务器中获取更大的数据集,这里使用angularjs的内置服务称为$http.使用angularjs的依赖注入为phoneList组件的控制器提供服务. 在我们的控制器中使用angularjs的$http服务,向我们的web服务器发出http请求,以获取文件中的数据. app/phone-list/phone-list.component1.js: angular.module('phoneList').component('phoneList',{ templateUrl

随笔:ajax传递数组,layui父子页面传值,下来菜单赋值,父页面数据获取,表格数据替换为字符串

一.Ajax向后台传递数组问题:(声明前台我使用的layui框架)例:我们要多前台一个数据表格进行批量删除操作,我们通过复选框选中数据id,将id存入一个数组中,然后利用ajax传递给后台,完成批量删除,再过程中我们需要加上traditional : true代码如下: function batchDel() { var datas; var ids = new Array();// 声明数组 layui.use('table', function() { var table = layui.t

jetty+bootstrap Carousel+springMVC+mybatis实现表格数据的轮播

index.jsp <%@ page language="java" pageEncoding="UTF-8"%> <%@include file="/taglibs.jsp"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&quo

【ASH】如何导出视图DBA_HIST_ACTIVE_SESS_HISTORY的查询结果数据

[ASH]如何导出视图DBA_HIST_ACTIVE_SESS_HISTORY的查询结果数据 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 如何导出ASH数据--利用exp导出基表的数据(重点) ② 12c的expdp参数VIEWS_AS_TABLES选项 ③ expdp工具不能导出哪些对象? Tips: ① 本文在itpub(http://blog.

Liger UI 表格数据查找/通过条件加载数据

api上的例子是在本地过滤的,无法使用,自己摸索了一下. javascript代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 //初始化ligerui控件 $(function (){         maingrid = $("#maingrid").ligerGrid({             columns: [                 {

基于Birt4.6实现报表表格数据的可编辑

奇葩需求:客户要求某业务系统中生成的报表数据可以编辑.为响应客户的需求,本文基于Birt 4.6实现报表数据的可编辑(伪修改). BIRT 是以 Java 和 JavaEE 为基础为 Web 应用程序开发的基于 Eclipse 的开源报表系统,其本身并不支持报表数据的修改.因此想要实现报表数据的可编辑,需要修改生成报表的渲染页面.本文的方案是在报表生成页面引入Jquery实现报表表格数据的可编辑,这是一种简单的快速实现方式,具体实现方案如下: 1)找到Birt渲染页面 Birt的渲染页面路径..

java使用POI,以excel文件的形式,导出前端表格数据

知识点:前端表格数据,调用后台接口,导出excel文件数据,使用到Apache POI接口 POI提供API给Java程序对Microsoft Office格式档案读和写的功能. (1)在pom.xml中引入POI和文件读写相关的包 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId></dependency> <depend

将包含经纬度点位信息的Excel表格数据导入到ArcMap中并输出成shapefile

将包含经纬信息的Excel表格数据,导入到ArcMap中并输出成shapefile,再进行后面的操作.使用这种方法可以将每一个包含经纬信息的数据在ArcMap中点出来. 一.准备数据 新建Excel表格,保存时设置后缀名为.xls(即2003Excel的表格).在表格首行建立各字段名,其中要包含经度和纬度的信息,用于在地图中标定位置.录入各记录属性,整理成表. 二.ArcMap中添加x-y事件 在打开的对话框中选择数据表和x.y对应的经度.纬度.选择坐标系统,这里因为我们的x,y对应的数据是经纬