长列表渲染

后端一次性返回万条数据,前端不做分页如何渲染

1、存储请求的元数据

const sourceList

2、定义一个渲染数组

const listData = []

3、按指定条数向渲染数组添加数据

let page = 0
listData = listData.concat(sourceList.slice(20 * page, 20 * (page + 1)))

4、设计添加数据的规则,如使用定时器,每隔20ms执行一次

function dealFn() {
    listData = listData.concat(sourceList.slice(20 * page2, 20 * (page2 + 1)))
    page2++
    if (sourceList.length / 20 > page2) {
        setTimeout(() => {
            dealFn()
        }, 20)
    }
}

dealFn()

使用setTimeout时,发现鼠标滚动较快时,还是会出现白屏的情况。打印执行时间会发现,setTimeout并不是严格按照指定的20ms间隔去执行,会超过这个时间,这个和事件循环机制有一定关系,会被其它任务阻塞延迟。
5、使用requestAnimationFrame实现一致,它的渲染频率会和浏览器刷新频率一致

function dealFn() {
    console.log('requestAnimationFrame', page)
    listData = listData.concat(sourceList.slice(20 * page, 20 * (page + 1)))
    page++
    if (sourceList.length / 20 > page) {
        requestId = requestAnimationFrame(dealFn)
        // dealFn()
    }
}

requestId = requestAnimationFrame(dealFn)

如果数据过大,在页面退出时还没有渲染完全,可手动停止

// 停止未完成的渲染
function stop() {
    cancelAnimationFrame(requestId)
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在维护基于ng1.x项目的过程中,接到了一个新的需求,那就是渲染一个超长的页面,调用接口什么的倒是顺风顺水,结果在...
    Elliott_077d阅读 2,425评论 0 2
  • 最近使用uniapp开发了一个小程序项目,小程序项目中有一个功能中有个100多条的列表,这个列表总是展示很慢,刚开...
    imniusir阅读 2,625评论 1 1
  • 问题描述 列表 (list) 是浏览器端用户交互的常见元素。一般的 select 由两个部分组成:外层的容器和内层...
    一拾五阅读 6,907评论 0 2
  • 如何实现一次性渲染 10 万条数据? 这是数据模拟请求接口 然后处理渲染数据总结了四种方法 17s(不做任何处理直...
    靴唯白阅读 192评论 0 1
  • 需求:渲染十万条数据,每条数据的内容是一个序号。 方案一:一次渲染 执行过程: script执行,打印js exe...
    compus135阅读 490评论 0 1