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

一、定时渲染

  • 思路:定时加载,分堆处理
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;
}

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

// 渲染到页面表格的数据
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;
}
  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值