前端优化之如何加载大量数据不卡顿

createDocumentFragment()

1、创建虚拟节点,在创建之初是空的
2、createDocumentFragment本身不属于文档流,插入节点时,它本身不插入节点,是它的所有子孙节点即括号中的内容插入节点,相当于一个占位符。
3、当需要添加多个dom元素时,先将元素放入createDocumentFragment中,会减少渲染次数,提高性能。

requestAnimationFrame()

requestAnimationFrame比起setTimeout和setInterVal的优势主要有两点:
1、requestAnimationFrame会把一帧中所有dom操作集中起来,在一次重回和回流中完成,并且重回和回流的时间间隔紧紧跟随浏览器的书信频率。
2、在隐藏和不可见元素中,requestAnimationFrame将不会进行重回和回流,这就减少了内存使用提高性能了。

<body>
    <ul></ul>
    <script>
        // 总共需要渲染的数据条数
        const total = 100000;
        // 每次渲染的条数
        const once = 10;
        // 插入数据需要的次数
        const countLoop = Math.ceil(total / once)
        // 渲染的次数
        let countRender = 0;
        // 获取插入的父节点
        const ul = document.querySelector('ul');

        // 添加数据的方法
        const add = () => {
            // 创建虚拟节点
            const fragment = document.createDocumentFragment();
            for (let i = 0; i < once; i++) {
                const li = document.createElement('li')
                li.innerHTML = `这是第${countRender}插入产生的随机数:${Math.floor(Math.random()*total)}`;
                fragment.appendChild(li);
            }
            ul.appendChild(fragment);
            countRender++;
            loop();
        }
        const loop = () => {
            if (countRender < countLoop) {
                window.requestAnimationFrame(add)
            }
        }
        loop()

    </script>
</body>
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值