小言_互联网的博客

前端面试题:如何渲染大批量数据而页面不被卡住

309人阅读  评论(0)

 FE-Interview  javascript 66


  
  1. setTimeout( () => {
  2. // 总共加载10万条数据
  3. const total = 100000
  4. // 一次加载20条
  5. const once = 20
  6. // 需要加载多少次
  7. const loopCount = total / once
  8. // 加载到第几次了
  9. let currentNum = 0
  10. function add() {
  11. // 创建一个文档碎片(上古朕哥叫法)
  12. let bigBox = document.createDocumentFragment()
  13. let ul = document.querySelector( 'ul')
  14. // 每次加载once条
  15. for ( let i = 0; i < once; i++) {
  16. let li = document.createElement( 'li');
  17. li.innerText = Math.random() * 100
  18. bigBox.appendChild(li)
  19. }
  20. // 插进UI
  21. ul.appendChild(bigBox)
  22. currentNum++
  23. loop()
  24. }
  25. function loop() {
  26. if (currentNum < loopCount) {
  27. // requestAnimationFrame(add) 每隔10000/屏幕刷新率 毫秒执行一次函数
  28. window.requestAnimationFrame(add)
  29. }
  30. }
  31. loop()
  32. }, 0)

 

知识点

document.createDocumentFragment( )

没什么好讲的,老知识了,科普一下吧😄

如果当我们要向document中添加大量数据时(比如10w条),如果逐条添加节点,这个过程就会十分缓慢。 

当然,你也可以建个新的节点,比如说ul,先将li添加到ul上,然后再将ul添加到页面中.但这样要在父元素中多添加一个<ul>但文档碎片不会产生这种额外节点。

window.requestAnimationFrame( )

与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机。具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新率是75Hz,那么这个时间间隔就变成了1000/75=13.3ms,换句话说就是,requestAnimationFrame的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次,这样就不会引起丢帧现象,也不会导致动画出现卡顿的问题。


转载:https://blog.csdn.net/qq_42044542/article/details/106024710
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场