1. 程式人生 > >大量資料列表渲染優化方法

大量資料列表渲染優化方法

身為前端,我們經常遇到資料列表渲染等功能,我相信很多人都會完成這類的功能,使用的方法也大多是迴圈資料,建立列表元素,然後經新元素新增到列表後面,如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>大量資料載入</title>
</head>
<body>
<div class="box">
    <ul id="ulBox"></ul>
</div>
</body> <script> (function () { const ul = document.getElementById('ulBox') if(!ul){ return } const array = new Array(100000) //存放將要渲染的列表資料 for (var i = 0; i < array.length; i++){ array[i] = i; var li = document.createElement('li'
); li.innerText = array[i]; ul.appendChild(li); } // 點選列表項 ul.addEventListener('click', function(e) { if(e.target.tagName === "LI"){ alert(e.target.innerText) } }) })()
</script> </html>

資料列表的渲染就這樣很快的完成了。對於少量的資料來說,這個方法足夠用了,但是當列表資料非常大的時候,我們不難發現,頁面需要載入很長時間才能正常顯示出來,這顯然不是我們想要的結果。

那麼如何在資料量很大的時候,還能很快顯示呢?接下來我們將分析並解決這個問題
我們都知道顯示屏的大小是固定的,無論資料量有多少,初看我們也只需要顯示最開始的資料而已,所以我們可以分批次讓資料顯示出來,這樣既不需要長時間的等待,也不會影響資料的顯示。

在此之前,我們需要了解一下createDocementFragment的功能,不太清楚的同學可以自己瞭解一下,這裡就不再贅述了

以下附上實現程式碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>大量資料載入和花樣列印</title>
</head>
<body>
<div class="box">
    box
    <div id="create"></div>
    <ul id="ulBox"></ul>
</div>
</body>
<script>
    (function () {
        const ul = document.getElementById('ulBox')
        if(!ul){
            return
        }

        const total = 100000;
        const once = 20;
        const number = total / once;
        var areadyNum = 0;
        const array = new Array(100000) //存放將要渲染的列表資料
        for (var i = 0; i < array.length; i++){
            array[i] = i;
        }

        function addItem() {
//        建立一個虛擬節點佔位
            const fragment = document.createDocumentFragment();

            for( var i = 0; i < once; i++){
                const li = document.createElement("li")
                li.innerText = array[areadyNum * once + i + 1]
                fragment.appendChild(li);
            }
            ul.appendChild(fragment)
            continueDo();
            areadyNum++;
        }

        function continueDo () {
            if(areadyNum < number){
                window.requestAnimationFrame(addItem);
            }
        }

        continueDo();

//        點選列表項
        ul.addEventListener('click', function(e) {
            if(e.target.tagName === "LI"){
                alert(e.target.innerText)
            }
        })
    })()
</script>
</html>

如此我們就可以看見資料在隨著時間慢慢的往頁面裡新增,此時大量資料列表渲染的問題也就解決了。