js长列表渲染的三种方式

原始方法

  1. 每一次都重新触发一次重排,性能很差,不建议使用
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <ul id="box"></ul>
  <script>
    console.time()
    let ul = document.getElementById('box')
    for (let i = 0; i < 100000; i++) {
      let li = document.createElement('li')
      li.innerHTML = i + 1
      ul.appendChild(li)
    }
    console.timeEnd()
    // 共计耗时:992.712890625ms
  </script>
</body>
</html>

分页渲染

  1. 通过分页加载的方式,提升首次加载的速度
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <ul id="box"></ul>
  <script>
    console.time()
    let ul = document.getElementById('box')
    let total = 100000
    let index = 0
    let pageSize = 2000
    let totalPage = total / pageSize
    function insert(curTotal, curIndex) {
      if (curTotal <= 0) {
        return
      }
      setTimeout(() => {
        for (let i = index; i < pageSize; i++) {
          let li = document.createElement('li')
          li.innerHTML = curIndex + 1 + i
          ul.appendChild(li)
        }
        insert(curTotal - pageSize, curIndex + pageSize)
      }, 0);
    }
    insert(total, index)
    console.timeEnd()
    // 首次加载2000条时间:0.344970703125ms
  </script>
</body>
</html>

requestAnimationFrame

  1. 极大地减少了重排的次数,提升性能,推荐使用
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <ul id="box"></ul>
  <script>
    console.time()
    let ul = document.getElementById('box')
    function insert(curTotal, curIndex) {
      if (curTotal <= 0) return
      window.requestAnimationFrame(() => {
        let frame = document.createDocumentFragment()
        for (let i = 0;  i < 2000; i++) {
          let li = document.createElement('li')
          li.innerHTML = curIndex + i + 1
          frame.appendChild(li)
        }
        ul.appendChild(frame)
        insert(curTotal - 2000, curIndex + 2000)
      })
    }
    insert(100000, 0)
    console.timeEnd()
    // default: 0.424072265625ms
  </script>
</body>
</html>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值