当前位置: 首页 > news >正文

【前端】处理一次性十万条数据渲染方案(不考虑后端分页)

文章目录

    • 一、定时渲染
    • 二、触底加载

一、定时渲染

  • 思路:定时加载,分堆处理
1. 例如,前端请求到十五条数据以后,先不直接渲染,而是将这些数据分堆分批次渲染
2. 比如,一堆放10条数据,十万条数据就是一万堆
3. 然后使用定时器一次渲染一堆,渲染一万次即可
  • 核心实现
// 渲染到页面表格的数据
let pagedata = [];
const plan = async () => {// 例如 bigdata 是接口请求到的十万条数据const bigdata = await getBigDat();// 分堆处理let arr = average(bigdata)// 渲染数据for(let i=0; i<arr.length; i++){setTimeout(()=>{pagedata = [...pagedata, ...arr[i]]},20*i)}
}
const average = (arr) => {let i = 0;let res = [];while(i < arr.length){// 一堆截取10条数据res.push(arr.slice(i, i+10));i = i+10;}return res;
}
  • 优化掉帧:requestAnimationFrame

由于定时器设置了间隔时间,当数据滚动较快,会导致页面渲染跟不上,从而出现掉帧现象

// 渲染到页面表格的数据
let pagedata = [];
const plan = async () => {// 例如 bigdata 是接口请求到的十万条数据const bigdata = await getBigDat();// 分堆处理let arr = average(bigdata)// 渲染数据useData(0);
}
const useData = (index)=>{if(index > arr.length -1){return}// 用动画请求帧优化requestAnimationFrame(()=>{pagedata = [...pagedata, ...arr[index]]index = index + 1;// 递归调用useData(index)})
}
const average = (arr) => {let i = 0;let res = [];while(i < arr.length){// 一堆截取10条数据res.push(arr.slice(i, i+10));i = i+10;}return res;
}

二、触底加载

  • 在vue中需要使用到饿了么的一个插件包el-table-infinite-scroll【官方文档】

  • 安装插件

npm install --save el-table-infinite-scroll
  • 引用插件
import Vue from 'vue';
import elTableInfiniteScroll from 'el-table-infinite-scroll';Vue.use(elTableInfiniteScroll)
  • 使用插件
<el-table:data="tabledata"v-el-table-infinite-scroll="load"
>
</el-table>
  • 核心代码
// 渲染到页面表格的原始数据
let pagedata = [];
// 渲染到页面表格的实时数据
let tabledata = [];
const plan = async () => {// 例如 bigdata 是接口请求到的十万条数据const bigdata = await getBigDat();// 分堆处理pagedata = average(bigdata)// 渲染数据load()
}
const load = (arr) => {if(pagedata.length === 0){return;}// 加载的时候,把pagedata数组的第一项取出来,拼接到展示的表格数据上let arr = pagedata[0]tabledata = tabledata.concat(arr);// 拼接完成后,再把pagedata数组的第一项删除即可pagedata.shift()
}
const average = (arr) => {let i = 0;let res = [];while(i < arr.length){// 一堆截取10条数据res.push(arr.slice(i, i+10));i = i+10;}return res;
}

相关文章:

  • 【安卓与苹果区别】详细讲解
  • uniapp发行H5获取当前页面query
  • QT UI设计
  • 【LeetCode周赛】第388场周赛
  • C while 循环
  • C++ lambda函数个人理解
  • 【话题】2024年AI辅助研发趋势,有那些应用领域
  • 【STL】string各种函数的应用
  • TinyEMU之RISCV-PK编译
  • SpringCloud-Alibaba-Nacos教程
  • vs2022 错误(活动) E1696 无法打开 源 文件 “bits/stdc++.h“解决办法
  • Github上哪些好用的工具
  • 2022 年河南省中等职业教育技能大赛
  • 网络编程:网络编程基础
  • 未来城市:数字孪生技术助力智慧城市构建
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • CSS 提示工具(Tooltip)
  • EventListener原理
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • k个最大的数及变种小结
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Swift 中的尾递归和蹦床
  • swift基础之_对象 实例方法 对象方法。
  • Twitter赢在开放,三年创造奇迹
  • vuex 学习笔记 01
  • win10下安装mysql5.7
  • 从PHP迁移至Golang - 基础篇
  • 从零开始学习部署
  • 从零开始在ubuntu上搭建node开发环境
  • 大快搜索数据爬虫技术实例安装教学篇
  • 开发基于以太坊智能合约的DApp
  • 用jQuery怎么做到前后端分离
  • 优秀架构师必须掌握的架构思维
  • 与 ConTeXt MkIV 官方文档的接驳
  • ionic异常记录
  • #include
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (八)Spring源码解析:Spring MVC
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (蓝桥杯每日一题)love
  • (一)u-boot-nand.bin的下载
  • (转)大道至简,职场上做人做事做管理
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .NET Framework .NET Core与 .NET 的区别
  • .NET中使用Redis (二)
  • /boot 内存空间不够
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • []FET-430SIM508 研究日志 11.3.31