当前位置:首页 > JavaScript

js实现分页

2026-04-03 17:45:36JavaScript

分页的基本实现思路

分页功能通常需要处理数据分割、页码计算和UI交互。以下是一个基于JavaScript的通用分页实现方案,适用于前端数据处理或API请求场景。

核心逻辑实现

数据分块处理 假设已有完整数据数组,需按每页显示条数分割:

function paginateData(data, itemsPerPage) {
  const totalPages = Math.ceil(data.length / itemsPerPage);
  const paginated = [];

  for (let i = 0; i < totalPages; i++) {
    const start = i * itemsPerPage;
    paginated.push(data.slice(start, start + itemsPerPage));
  }

  return {
    pages: paginated,
    totalPages: totalPages
  };
}

页码计算 根据当前页和总页数生成页码范围:

js实现分页

function getPageRange(currentPage, totalPages, maxVisible = 5) {
  let start = Math.max(1, currentPage - Math.floor(maxVisible/2));
  let end = Math.min(totalPages, start + maxVisible - 1);

  if (end - start + 1 < maxVisible) {
    start = Math.max(1, end - maxVisible + 1);
  }

  return Array.from({length: end - start + 1}, (_, i) => start + i);
}

DOM交互示例

分页控件生成 动态生成分页按钮的示例:

function renderPagination(totalPages, currentPage, container) {
  container.innerHTML = '';

  // 上一页按钮
  if (currentPage > 1) {
    container.appendChild(createPageButton('«', currentPage - 1));
  }

  // 页码按钮
  getPageRange(currentPage, totalPages).forEach(page => {
    const btn = createPageButton(page, page);
    if (page === currentPage) btn.classList.add('active');
    container.appendChild(btn);
  });

  // 下一页按钮
  if (currentPage < totalPages) {
    container.appendChild(createPageButton('»', currentPage + 1));
  }
}

function createPageButton(text, page) {
  const btn = document.createElement('button');
  btn.textContent = text;
  btn.dataset.page = page;
  return btn;
}

异步数据加载方案

当数据需要从API获取时:

js实现分页

async function loadPaginatedData(url, page, perPage) {
  try {
    const response = await fetch(`${url}?page=${page}&per_page=${perPage}`);
    const data = await response.json();
    return {
      items: data.items,
      total: data.total_count,
      currentPage: page
    };
  } catch (error) {
    console.error('分页数据加载失败:', error);
    return { items: [], total: 0 };
  }
}

完整实现示例

结合上述模块的完整示例:

class Paginator {
  constructor(container, options = {}) {
    this.container = container;
    this.itemsPerPage = options.perPage || 10;
    this.maxVisibleButtons = options.maxButtons || 5;
    this.currentPage = 1;
    this.data = [];

    container.addEventListener('click', e => {
      if (e.target.tagName === 'BUTTON') {
        this.handlePageChange(parseInt(e.target.dataset.page));
      }
    });
  }

  update(data) {
    this.data = data;
    this.totalPages = Math.ceil(data.length / this.itemsPerPage);
    this.render();
    return this.getCurrentItems();
  }

  getCurrentItems() {
    const start = (this.currentPage - 1) * this.itemsPerPage;
    return this.data.slice(start, start + this.itemsPerPage);
  }

  handlePageChange(page) {
    if (page >= 1 && page <= this.totalPages) {
      this.currentPage = page;
      this.render();
      return this.getCurrentItems();
    }
  }

  render() {
    renderPagination(
      this.totalPages, 
      this.currentPage, 
      this.container, 
      this.maxVisibleButtons
    );
  }
}

样式建议

基础分页样式可参考:

.pagination {
  display: flex;
  gap: 4px;
}

.pagination button {
  padding: 6px 12px;
  border: 1px solid #ddd;
  background: white;
  cursor: pointer;
}

.pagination button.active {
  background: #007bff;
  color: white;
  border-color: #007bff;
}

注意事项

  • 大数据量情况下建议使用服务端分页
  • 移动端需考虑响应式布局,可能需要简化分页控件
  • 可添加页面跳转输入框增强用户体验
  • 对于SPA应用,建议将当前页状态保存在URL或全局状态管理中

以上实现可根据具体需求进行调整,核心逻辑保持不变。服务端分页只需替换数据获取逻辑即可。

标签: 分页js
分享给朋友:

相关文章

vue搜索过后实现分页

vue搜索过后实现分页

实现 Vue 搜索后分页的方法 数据绑定与搜索逻辑 在 Vue 组件中定义数据属性,包括原始数据列表、搜索关键词、分页相关参数: data() { return { originalLi…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

php分页功能的实现

php分页功能的实现

分页功能的基本原理 分页功能的核心是通过SQL的LIMIT子句实现数据分段查询。LIMIT接受两个参数:起始位置偏移量和每页记录数。例如查询第2页(每页10条)的SQL语句为: SELECT * F…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…