亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS中頁面列表加載的常用方法總結(jié)

 更新時間:2022年09月18日 08:57:07   作者:MarkGuan  
在日常前端開發(fā)過程中,常用到頁面列表加載。這篇文章主要為大家介紹三種常用方法,分別是分頁加載、按鈕加載以及滾動加載,需要的可以參考一下

導(dǎo)語:最近由于一些事情需要處理,所以沒來得及寫技術(shù)總結(jié)了。今天終于可以坐下來好好的梳理一下脈絡(luò),說一下那個在日常前端開發(fā)過程中,常用到的頁面列表加載的方法總結(jié)。這里介紹三種方法,分別是分頁加載、按鈕加載以及滾動加載。

方法簡介

在日常的前端開發(fā)過程中,我們經(jīng)常會碰到列表很長,不可能完全顯示出來,所以就要進行分頁,每頁固定顯示幾條,然后下面是頁數(shù),點到哪頁顯示哪頁的內(nèi)容。

除了常見的分頁加載外,還要點擊按鈕加載,這種加載方法就是不需要點擊下一頁這種了,直接點擊按鈕往第一頁的后面補上下一頁的內(nèi)容,非常方便。

除了以上兩種,滾動加載也是用的比較多的一種列表加載方法,下面就這三種方法做一下總結(jié)歸納,方便需要的小伙伴們使用。

封裝實現(xiàn)

下面就對三種方法分別做一下原理解析和方法實現(xiàn)。

下面的列表使用了JSONPlaceholder站點上的一些數(shù)據(jù)作為列表來源。

分頁加載

當(dāng)頁面的需求是要顯示一個列表或者表格,總數(shù)很多放不下,這時候可以把全部的數(shù)據(jù)分成多頁,每頁顯示固定的條數(shù),計算出總頁數(shù),然后渲染一下就可以了。

頁面布局

<div class="wrap">
    <ul id="list"></ul>
    <ul id="pages"></ul>
</div>
.wrap {
    max-width: 960px;
    margin: 0 auto;
    padding: 15px 0;
}
 
.wrap li {
    padding: 5px 0;
    list-style: square;
}
 
.wrap li h3,
.wrap li p {
    text-transform: capitalize;
}
 
.wrap li h3:hover {
    color: #f00;
    cursor: pointer;
}
 
#pages li {
    display: inline-block;
    margin-right: 10px;
    list-style: none;
}
 
#pages button {
    width: auto;
    min-width: 40px;
    height: 40px;
    background: #fff;
    box-shadow: 0 0 5px #fff;
    border: 1px solid #ccc;
    border-radius: 5px;
    font-size: 16px;
}
 
#pages button:hover,
#pages button.active {
    color: #fff;
    border-color: #f00;
    background: #f00;
    cursor: pointer;
}
 
#pages button.dis {
    cursor: no-drop;
}
 
.wrap .loading {
    line-height: 70vh;
    text-align: center;
    list-style: none;
}
 
.wrap .nodata {
    list-style: none;
    text-align: center;
}

定義變量

let datas = [], // 分組列表
current = 1, // 當(dāng)前頁
pages = 0, // 總頁數(shù)
total = 0, // 總數(shù)
listElem = document.getElementById('list'), // 列表內(nèi)容
pageElem = document.getElementById('pages'); // 頁數(shù)按鈕

處理數(shù)據(jù)

我們使用axios來獲取json數(shù)據(jù),模擬抓取接口的情況。

// 獲取列表
async function getList (page = 1) {
    let res = await axios.get('https://jsonplaceholder.typicode.com/posts');
    if (res.status === 200) {
        let data = sliceData(res.data);
        pages = data.pages;
        total = res.data.length;
        datas = [...data.list];
        return {
            code: 200,
            msg: 'get_succ',
            data: {
                list: data.list[page-1],
                current: page,
                pages: data.pages,
                total: list.length,
            }
        }
    }
}

寫一個切割數(shù)組的方法,分成等份的數(shù)組。

// 處理數(shù)據(jù)
function sliceData (list) {  
    let newArr = [],step = 10,pages = Math.ceil(list.length/10);
    for (let i = 0; i < list.length; i+=step) {
        let item = list.slice(i, i+step);
        newArr.push(item);
    }
    return {
        list: newArr,
        pages,
    };
}

顯示列表

showList(current);
 
// 顯示列表
async function showList (current) {
    let data = null;
    listElem.innerHTML = '';
    listElem.innerHTML = '<li class="loading">加載中...</li>';
    if (datas && datas.length) {
        data = {
            code: 200,
            msg: 'get_succ',
            data: {
                list: datas[current-1],
                current: current,
                pages,
                total,
            }
        }
    } else {
        data = await getList(current);
    }
    if (data.code === 200) {
        let list = data.data.list;
        if (list && list.length) {
            let liStr = '',pageStr = '';
            for (const item of list) {
                liStr += `<li>
                    <h3>${item.title}</h3>
                    <p>${item.body}</p>
                </li>`;
            }
            
            setTimeout(() => {
                listElem.innerHTML = liStr;
            }, 1000);
 
            if (pageElem.innerText === '') {
                for (let i = 0; i < data.data.pages; i++) {
                    pageStr += `<li><button class="page" data-id="${i+1}">${i+1}</button></li>`
                }
                pageElem.innerHTML = `
                <li><button id="start" data-id="1">首頁</button></li>
                <li><button id="prev">上一頁</button></li>
                ${pageStr}
                <li><button id="next">下一頁</button></li>
                <li><button id="end" data-id="${data.data.pages}">尾頁</button></li>`;
                showHighLight(current);
                addClick();
            }
        } else {
            listElem.innerHTML = '<li class="nodata">暫無數(shù)據(jù)</li>';
        }
    }
}

添加點擊事件

// 添加點擊
function addClick () {  
    let btns = document.querySelectorAll('#pages li button');
    for (const item of btns) {
        item.addEventListener('click', toggleList, false);
    }
}

切換頁面內(nèi)容

// 切換頁面
function toggleList (event) {  
    let id = event.target.dataset.id,
    bid = event.target.id;
    if (id) {
        current = Number(id);
    }
    if (bid == 'prev') {
        if (current <= 1) {
            current = 1;
        } else {
            current--;
        }
    } else if (bid == 'next') {
        if (current >= pages) {
            current = pages;
        } else {
            current++;
        }
    }
    showHighLight(current, bid);
    showList(current);
}

顯示高亮

// 顯示高亮
function showHighLight (current, bid) {
    let btns = document.querySelectorAll('.page'),
    startBtn = document.getElementById('start'),
    endBtn = document.getElementById('end');
    for (const item of btns) {
        item.className = 'page';
    }
    btns[current-1].className = 'page active';
    startBtn.className = current == 1 ? 'active dis' : '';
    endBtn.className = current == pages ? 'active dis' : '';
}

其中渲染好頁面后,還加了一個定時器是模擬從服務(wù)器獲取數(shù)據(jù)等待過程的效果,真實情況下不需要這樣。

按鈕加載

按鈕加載的方法和上面的相似,也就是分頁那塊改成一個按鈕了,不斷在現(xiàn)有的列表中添加新的列表內(nèi)容,其余和分頁加載沒有太大區(qū)別。

頁面結(jié)構(gòu)

<div class="wrap">
    <ul id="list"></ul>
    <p class="loadmore">加載中...</p>
    <p class="more-box">
        <button id="more">加載更多</button>
    </p>
</div>

頁面美化

.more-box {
    text-align: center;
}
 
#more {
    padding: 10px;
    background: none;
    border: 1px solid #ccc;
    border-radius: 5px;
}
 
#more:hover {
    cursor: pointer;
    border-color: #f00;
    background-color: #f00;
    color: #fff;
}
 
.loadmore {
    text-align: center;
}
 
.hide {
    display: none;
}

獲取變量

let loadMore = document.querySelector('.loadmore'),
moreBtn = document.getElementById('more');

點擊加載更多

// 添加點擊
moreBtn.addEventListener('click', addList, false);
 
// 切換頁面
function addList () {
    if (current < pages) {
        current+=1;
        showList(current);
    } else {
        moreBtn.innerText = '沒有更多了';
    }
}

顯示頁面

在原有的顯示列表方法基礎(chǔ)上修改幾處就好了。

// 顯示列表
async function showList (current) {
    let data = null;
    loadMore.className = 'loadmore';
    if (datas && datas.length) {
        data = {
            code: 200,
            msg: 'get_succ',
            data: {
                list: datas[current-1],
                current: current,
                pages,
                total,
            }
        }
    } else {
        data = await getList(current);
    }
    if (data.code === 200) {
        let list = data.data.list;
        if (list && list.length) {
            let liStr = '',pageStr = '';
            for (const item of list) {
                liStr += `<li>
                    <h3>${item.title}</h3>
                    <p>${item.body}</p>
                </li>`;
            }
 
            listElem.innerHTML += liStr;
 
        } else {
 
            listElem.innerHTML = '<li class="nodata">暫無數(shù)據(jù)<li>';
        }
 
        
        setTimeout(() => {
            loadMore.className = 'loadmore hide';
        }, 1000);
    }
}

滾動加載

滾動加載就是在頁面滾動到底部后自動添加新的一頁內(nèi)容到當(dāng)前列表后面,每次滾動根據(jù)計算動態(tài)添加內(nèi)容。

就是在按鈕加載的基礎(chǔ)上更改而來的,具體的原理是當(dāng)文檔的到頂部的高度加上文檔的可視化高度大于文檔的滾動高度的時候就加載頁面。

頁面結(jié)構(gòu)

<div class="wrap">
    <ul id="list"></ul>
    <p class="loadmore">加載中...</p>
</div>

滾動判斷

document.addEventListener('scroll', checkScroll, false);
function checkScroll () {  
    let scrollTop = document.documentElement.scrollTop,
    clientHei = document.documentElement.clientHeight,
    scrollHeight = document.documentElement.scrollHeight;
    if (scrollTop + clientHei >= scrollHeight) {
        addList();
    }
}
 
// 切換頁面
function addList () {
    if (current < pages) {
        current+=1;
        showList(current);
    } else {
        loadMore.innerText = '沒有更多了';
    }
}

效果預(yù)覽

分頁加載

在線預(yù)覽

按鈕加載

在線預(yù)覽

滾動加載

在線預(yù)覽

到此這篇關(guān)于JS中頁面列表加載的常用方法總結(jié)的文章就介紹到這了,更多相關(guān)JS頁面列表加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript計算用戶打開網(wǎng)頁的停留時間

    javascript計算用戶打開網(wǎng)頁的停留時間

    本文介紹了javascript計算用戶打開網(wǎng)頁的停留時間,大家參考使用吧
    2014-01-01
  • JS實現(xiàn)直接運行html代碼的方法

    JS實現(xiàn)直接運行html代碼的方法

    這篇文章主要介紹了JS實現(xiàn)直接運行html代碼的方法,涉及javascript窗口操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • JavaScript Window 打開新窗口(window.location.href、window.open、window.showModalDialog)

    JavaScript Window 打開新窗口(window.location.href、windo

    本文主要介紹了JavaScript Window 打開新窗口的三種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • JavaScript三元運算符的多種使用技巧

    JavaScript三元運算符的多種使用技巧

    這篇文章主要介紹了JavaScript三元運算符的多種使用技巧,本文講解了普通用法、稍微聰明點的用法、甚至更變態(tài)些的用法等,需要的朋友可以參考下
    2015-04-04
  • Ajax請求時無法重定向的問題解決代碼詳解

    Ajax請求時無法重定向的問題解決代碼詳解

    這篇文章主要介紹了Ajax請求時無法重定向的問題解決代碼詳解,當(dāng)使用Ajax請求時,如果后臺進行重定向到其他頁面時是無法成功的,只能在瀏覽器地址欄輸入才能夠?qū)崿F(xiàn)重定向。下面我們來看看解決方法吧
    2019-06-06
  • three.js中g(shù)sap動畫庫實現(xiàn)物體的動畫

    three.js中g(shù)sap動畫庫實現(xiàn)物體的動畫

    本文主要介紹了three.js中g(shù)sap動畫庫實現(xiàn)物體的動畫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • layui加載表格,綁定新增,編輯刪除,查看按鈕事件的例子

    layui加載表格,綁定新增,編輯刪除,查看按鈕事件的例子

    今天小編就為大家分享一篇layui加載表格,綁定新增,編輯刪除,查看按鈕事件的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 最新評論