美文网首页
面试题--如何渲染几万条数据并不卡住界面

面试题--如何渲染几万条数据并不卡住界面

作者: 奔跑的丸子129 | 来源:发表于2019-04-16 16:55 被阅读0次

    根据题意,如果我们一次性渲染刷新几万条数据,页面会卡顿,因此只能分批渲染,既然知道原理我们就可以使用setInterval和setTimeout、requestAnimationFrame来实现定时分批渲染,实现每16 ms 刷新一次
    requestAnimationFrame跟setTimeout/setInterval差不多,通过递归调用同一方法来不断更新画面以达到动起来的效果,但它优于setTimeout/setInterval的地方在于它是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销。

    function refresh(total, onceCount) {
      //total -> 渲染数据总数 onceCount -> 一次渲染条数
      let count = 0, //初始渲染次数值
        loopCount = total / onceCount //渲染次数
      function refreshAnimation() {
        /*
        * 在此处渲染数据
        */
        if (count < loopCount) {
          count++
          requestAnimationFrame(refreshAnimation)
        }
      }
      requestAnimationFrame(refreshAnimation)
    }
    

    当然也可以使用setTimeout来实现:

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>Document</title>
      </head>
      <body>
        <ul>
          控件
        </ul>
        <script>
          setTimeout(() => {
            // 插入十万条数据
            const total = 100000
            // 一次插入 20 条,如果觉得性能不好就减少
            const once = 20
            // 渲染数据总共需要几次
            const loopCount = total / once
            let countOfRender = 0
            let ul = document.querySelector('ul')
            function add() {
              // 优化性能,插入不会造成回流
              const fragment = document.createDocumentFragment()
              for (let i = 0; i < once; i++) {
                const li = document.createElement('li')
                li.innerText = Math.floor(Math.random() * total)
                fragment.appendChild(li)
              }
              ul.appendChild(fragment)
              countOfRender += 1
              loop()
            }
            function loop() {
              if (countOfRender < loopCount) {
                window.requestAnimationFrame(add)
              }
            }
            loop()
          }, 0)
        </script>
      </body>
    </html>
    

    相关文章

      网友评论

          本文标题:面试题--如何渲染几万条数据并不卡住界面

          本文链接:https://www.haomeiwen.com/subject/opjxwqtx.html