原始方法
- 每一次都重新触发一次重排,性能很差,不建议使用
<!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>
分页渲染
- 通过分页加载的方式,提升首次加载的速度
<!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
- 极大地减少了重排的次数,提升性能,推荐使用
<!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>
906

被折叠的 条评论
为什么被折叠?



