分页控件详解

发布时间:2023-05-21

分页控件是一个非常常见的网页控件,很多网站都使用它来让用户方便浏览大量数据。在本文中,我们将从各个方面来详细阐述分页控件的使用与实现。

一、基本概念

分页控件,顾名思义就是将数据进行分页展示的一种控件。简单来说,就是将数据按照一页一页展示,而不是一次性将所有数据展示出来。它可以让用户更加方便地查看和浏览数据,同时也可以降低页面的加载压力。 通常情况下,分页控件会展示以下几个基本元素:

  • 总页数
  • 当前页码
  • 每页数据量
  • 上一页、下一页按钮
  • 跳转到指定页码的输入框和按钮

代码展示

<div class="pagination">
  <span class="pagination-total">共100页</span>
  <a href="#" class="pagination-btn prev"></a>
  <span class="pagination-current">1/100</span>
  <a href="#" class="pagination-btn next"></a>
  <span class="pagination-page-size">每页10条</span>
  <span class="pagination-jump">
    跳转到
    <input type="text" class="pagination-jump-input">
    <a href="#" class="pagination-jump-btn">Go</a>
  </span>
</div>

二、功能实现

1、计算总页数

计算总页数是分页控件最基本的功能之一。一般情况下,我们会将数据量和每页数据量作为参数传入分页控件,控件根据这些参数来计算总页数。 计算总页数的公式是:总页数 = ceil(数据量 ÷ 每页数据量)

/**
 * 计算总页数
 * @param {Number} total 数据总量
 * @param {Number} pageSize 每页数据量
 * @return {Number} 总页数
 */
function getTotalPage(total, pageSize) {
  return Math.ceil(total / pageSize);
}

2、渲染分页控件

渲染分页控件是将每个元素生成对应的 HTML 结构,并添加到页面上。

/**
 * 渲染分页控件
 * @param {Number} currentPage 当前页码
 * @param {Number} totalPage 总页数
 * @param {Number} pageSize 每页数据量
 * @param {Function} onPageChange 当翻页时触发的回调函数
 */
function renderPagination(currentPage, totalPage, pageSize, onPageChange) {
  const pagination = document.createElement('div');
  pagination.classList.add('pagination');
  const total = document.createElement('span');
  total.classList.add('pagination-total');
  total.innerText = `共${totalPage}页`;
  pagination.appendChild(total);
  const prev = document.createElement('a');
  prev.classList.add('pagination-btn', 'prev');
  prev.href = '#';
  pagination.appendChild(prev);
  const current = document.createElement('span');
  current.classList.add('pagination-current');
  current.innerText = `${currentPage}/${totalPage}`;
  pagination.appendChild(current);
  const next = document.createElement('a');
  next.classList.add('pagination-btn', 'next');
  next.href = '#';
  pagination.appendChild(next);
  const page_size = document.createElement('span');
  page_size.classList.add('pagination-page-size');
  page_size.innerText = `每页${pageSize}条`;
  pagination.appendChild(page_size);
  const jump = document.createElement('span');
  jump.classList.add('pagination-jump');
  jump.innerHTML = `
    跳转到
    <input type="text" class="pagination-jump-input">
    <a class="pagination-jump-btn" href="#">Go</a>
  `;
  pagination.appendChild(jump);
  document.body.appendChild(pagination);
  // 绑定事件
  prev.addEventListener('click', e => {
    e.preventDefault();
    if (currentPage > 1) {
      onPageChange(currentPage - 1);
    }
  });
  next.addEventListener('click', e => {
    e.preventDefault();
    if (currentPage < totalPage) {
      onPageChange(currentPage + 1);
    }
  });
  jump.querySelector('.pagination-jump-btn').addEventListener('click', e => {
    const page = jump.querySelector('.pagination-jump-input').value;
    if (page && /^\d+$/.test(page) && page >= 1 && page <= totalPage) {
      onPageChange(parseInt(page));
    }
    e.preventDefault();
  });
}

3、数据分页

数据分页是将原始数据按照每页数据量进行切分,返回指定页码的数据。

/**
 * 数据分页
 * @param {Array} data 原始数据
 * @param {Number} currentPage 当前页码
 * @param {Number} pageSize 每页数据量
 * @return {Array} 分页后的数据
 */
function paginate(data, currentPage, pageSize) {
  const startIndex = (currentPage - 1) * pageSize;
  const endIndex = startIndex + pageSize - 1;
  return data.slice(startIndex, endIndex + 1);
}

三、实战演练

接下来,让我们使用上述代码实现一个简单的分页控件,并应用到一个博客文章列表中。

1、HTML 结构

假设数据来自一个 AJAX 请求,我们需要首先渲染一个博客文章列表的 HTML 结构,再在其中嵌入分页控件。

<div class="blog">
  <ul class="article-list">
    <li>
      <h3><a href="#">文章标题</a></h3>
      <p>文章摘要...</p>
    </li>
    <li>...</li>
    <li>...</li>
  </ul>
  <!-- 分页控件将嵌入此处 -->
</div>

2、JavaScript 代码

接下来,我们将使用上述函数来实现一个完整的分页控件,并将其渲染到博客文章列表中。

function loadBlogArticles(page = 1, pageSize = 10) {
  fetch(`/api/articles?page=${page}&pageSize=${pageSize}`)
    .then(response => response.json())
    .then(data => {
      const articles = document.querySelector('.blog .article-list');
      articles.innerHTML = '';
      data.forEach(article => {
        const li = document.createElement('li');
        li.innerHTML = `
          <h3>${article.title}</h3>
          <p>${article.summary}</p>
        `;
        articles.appendChild(li);
      });
      const totalPage = getTotalPage(data.totalCount, pageSize);
      renderPagination(page, totalPage, pageSize, page => {
        loadBlogArticles(page, pageSize);
      });
    });
}
loadBlogArticles();

四、总结

本文我们详细阐述了分页控件的基本概念、功能实现和实战演练。希望本文可以帮助读者更好地理解和使用分页控件。