前言
紀錄學習分頁的實作邏輯,將大量需要呈現的資訊分隔開來,避免造成瀏覽問題。
邏輯
在製作分頁的時候會需要使用到幾個要點,限制每頁需要的資料,在前往下一頁的時候需要使用偏移。
- limit: 限制資訊筆數
- offset: 偏移量
- page: 目前頁數
- pages: 全部數到的頁數
- totalPage: 將 pages 轉換成頁碼 array 方便前端渲染
- previous: 往前一頁
- next: 往後移頁
搭配 sequelize 提供的語法 offset、limit 來完成目的
// Fetch 10 instances/rows |
步驟
- 設定讀取筆數
- 宣告頁碼
- 宣告 offset 計算偏移量
- 計算總頁數(無條件進位) = 總資料數 / 讀取筆數
- 使用 array 寫進數量
- 使用判斷式,計算前一頁頁數
- 使用判斷式,計算下一頁頁數
實作
最初:// 設定讀取筆數
let pagaLimit = 10
// 宣告頁碼
let page = Number(req.query.page) || 1
// 宣告 offset 計算偏移量
let offset = 0
if (req.query.page) {
offset = (req.query.page - 1) * pageLimit
}
Project.findAndCountAll({offest: offset, limit: pagaLimit})
.then(projects => {
// 計算總頁數
let pages = Math.ceil( projects.count / pageLimit )
// 產生 array
let totalPage = Array.from({length: pages}).map((item, index) => index + 1)
// 前一頁
let prev = page - 1 < 1 ? 1 : page -1
// 後一頁
let next = page + 1 > pages ? pages : page + 1
return res.render('path', {projects, page, totalPage, prev, next})
})
第二次實作:
最後需要傳出 page、 totalPage、 prev、next,一樣會使用到 pagaLimit、page、offse、totalPage、prev、next。
// 從其他地方傳入筆數 |
心得
將目前學習到的分頁方式做個小整理,在未來希望能夠了解更多不同的做法。