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

2024-07-14 1085阅读

文章目录

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

      一、定时渲染

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

            二、触底加载

            • 在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)
                
                • 使用插件
                  
                  
                  • 核心代码
                    // 渲染到页面表格的原始数据
                    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 
                                    
                                    
                                    
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]