渲染大量数据,利用setTimeout提升渲染速度

举个栗子,有一个需求是用js实现渲染一个2万行6列的表格,我们首先不做代码优化,看下效果会怎么样,代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>渲染table测试</title>
</head>
<body>
<button onclick="renderTableFun()">点击渲染table</button>
<div id="box" class="container"></div>
<script type="text/javascript">
function renderTableFun(){
    var boxDom = document.getElementById('box');
    var cTable = document.createElement('table');
    var index = 0;
    for(var i = 0;i<20000;i++){
        var tr = document.createElement('tr');
        for(var j= 0;j<6;j++){
            var td = document.createElement('td');
            td.innerHTML = index;
            tr.appendChild(td);
            index++;
        };
        cTable.appendChild(tr);
    };
    boxDom.appendChild(cTable);
};
</script>
</body>
</html>

我们在浏览器中看到的效果:浏览器等待了一段时间才渲染出来,在此期间浏览器像是被卡主了一样什么都不能做。

对上面的代码做一个优化,使其分几步完成上面的需求,这样每次要做的事情就不会太多了。代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>渲染table测试</title>
</head>
<body>
<button onclick="renderTableFun()">点击渲染table</button>
<div id="box" class="container"></div>
<script type="text/javascript">
function renderTableFun(){
    var boxDom = document.getElementById('box');
    var cTable = document.createElement('table');
    var index = 0;
    //这次我们分5步来完成上面的任务,其实也可以分更多步
    var oneStepNum = 4000;
    var currentStep = 1;
    var renderTable = function renderTable(){
        for(var i = 0;i<oneStepNum;i++){
            var tr = document.createElement('tr');
            for(var j = 0;j<6;j++){
                var td = document.createElement('td');
                td.innerHTML = index;
                tr.appendChild(td);
                index++;
            };
            cTable.appendChild(tr);
        };
        boxDom.appendChild(cTable);
        currentStep++;
        if(currentStep>5){
            clearTimeout(timer);
            return;
        };
        var timer = setTimeout(renderTable,0);
    };
    renderTable();//渲染dom
};
</script>
</body>
</html>

我们发现代码经过这样优化之后,dom可以很快就被渲染出来。其思想就是:把一个很耗性能的操作或长时间的操作分解成一些耗性能较少或这耗时少的操作,就不会造成耗时长的代码使浏览器卡死的情况了,能快速的把页面先呈现在用户面前。

其实很多优化代码都是采用这种原理做的,比如节流、防抖等。

参考文章

https://www.cnblogs.com/MagicalOfD/p/6545161.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值