@bramus/pagination-sequence

中文文档
1.2.1发布于 2023/07/19MITESM + CJS近 30 天下载 1.1万

生成一个数字序列, 用于 Pagination 组件, 聪明的方法 .

中文使用文档
文档目录10 节
  1. 安装
  2. 用法/ 实例
  3. API 密码
  4. generate()
  5. generateFromObj()
  6. 原则
  7. 整合实例
  8. 反应
  9. 许可证
  10. 其他语言执行

JavaScript Pagination Sequence Generator

JavaScript 移植序列生成器

生成一个数字序列, 用于 Pagination 组件, 聪明的方法 .

安装

npm i @bramus/pagination-sequence

用法/ 实例

这个库作为ES模块而来,并暴露出一个函数/算术来生成一系列的pagination条目.

import { generate } from '@bramus/pagination-sequence';

const sequence = generate(67, 74);
// ~> [1, 2, '…', 65, 66, 67, 68, 69, '…', 73, 74]

或者,你可以使用 generateFromObj 它接受配置对象作为参数 :

import { generateFromObj } from '@bramus/pagination-sequence';

const sequence = generateFromObj({
    curPage: 67,
    numPages: 74,
});
// ~> [1, 2, '…', 65, 66, 67, 68, 69, '…', 73, 74]

请注意, 这是一个框架不可知库: 生成的数组不是以任何方式提供, 而是必须输入到您的 Pagenation 组件中进行渲染 .

寻找一些Pagination组件的灵感? 见 整合实例 下面可以查看如何使用 JavaScript 框架 Du JourTM .

API 密码

generate()

被曝光者 generate 函数有下列 API :

generate(curPage, numPages, numPagesAtEdges = 2, numPagesAroundCurrent = 2, glue = '…');

参数:

  • curPage: 当前活动页面
  • numPages: 页数总数
  • numPagesAtEdges (默认: 2): 在外缘显示的页数.
  • numPagesAroundCurrent (默认: 2): 活动页面周围显示的页面数.
  • glue (默认 : “... ” ): 当出现缺口时显示的字符串

generateFromObj()

这个 generateFromObj 函数接受单个 opts 对象。 其成员都是上述参数。 尽可能设置默认值 .

const { 
    curPage = 1,
    numPages = 1,
    numPagesAtEdges = 2,
    numPagesAroundCurrent = 2,
    glue = '…',
} = opts;

原则

该算法有观点并遵循了这些原则:

  • 稳定输出

    当生成一个序列时,它总是会生成相同数量的条目,任何 curPage 数值。 当在系列边缘查看一页时,这会导致 numPagesAtEdges 无人理睬.

    例如:没有 generate(2, 12, 1, 1) 返回时 01-[02]-03-..-12 (5个条目)它会回来 01-[02]-03-04-05-..-12 (7个条目)这是一个刻意的选择,因为 generate(7, 12, 1, 1) 还会返回 7 个条目 : 01-..-06-[07]-08-..-12。 。 。 .

    在生成稳定的条目后,在屏幕上渲染时,输出也会是视觉上稳定的.

  • 总是包含到边缘的链接

    该算法将始终包含第一页和最后一页的链接.

    示例:在查看第50页第25页时,算法会包含一个与第1页和50页的链接.

  • 无不必要的空白

    当算法检测到一个只有"1项宽"的空隙时,它将用实际数字来取而代之.

    举个例子:一个愚蠢的选择 generate(4, 9, 1, 1),将生成 01-..-03-[04]-05-..-09。算法将第一个缺口更正为 02 将返回 01-02-03-[04]-05-..-09 换句话说.

整合实例

反应

尝试在线: https://codepen.io/bramus/pen/NWaxNKQ 互联网档案馆的存檔,存档日期2013-12-02

import React from "react";
import ReactDOM from "react-dom";
import { generate } from "@bramus/pagination-sequence";

const BASE_URL = '#';

const PaginationEntry = ({ value, onEntryClick = null, label = null, title = null, isCurrent = false, isDisabled = false, ...props }) => {
    label ??= value;
    title ??= `Go to page ${value}`;

    const onClick = (e) => {
        e.stopPropagation();
        e.preventDefault();
        
        e.target.blur();
        
        if (onEntryClick) {
            onEntryClick(value);
        }
    }
        
    if (value == '…') {
        return (
            <li data-pagination-ellipsis {...props}><span>{label}</span></li>
        );
    }

    if (isDisabled) {
        return (
            <li data-pagination-disabled {...props}><span>{label}</span></li>
        );
    }

    if (isCurrent) {
        props['data-pagination-current'] = true;
    }

    return (
        <li {...props}>
            <a href={`${BASE_URL}/page/${value}`} title={title} onClick={onClick}>{label}</a>
        </li>
    );
}

const Pagination = ({ curPage, numPages, numPagesAtEdges = 2, numPagesAroundCurrent = 2, onEntryClick = null }) => {
    const sequence = generate(curPage, numPages, numPagesAtEdges, numPagesAroundCurrent);
    // console.log(sequence);

    return (
        <ul className="pagination">
            <PaginationEntry data-pagination-first onEntryClick={onEntryClick} value={1} title="Go to First Page" label="&laquo;" isDisabled={curPage === 1} />
            <PaginationEntry data-pagination-prev onEntryClick={onEntryClick} value={curPage-1} title="Go to Previous Page" label="&lsaquo;" isDisabled={curPage === 1} />
            {sequence.map((val, idx) => 
                <PaginationEntry key={`page-${(val == '…') ? `…-${idx}` : val}`} onEntryClick={onEntryClick} value={val} isCurrent={val == curPage} />
            )}
            <PaginationEntry data-pagination-next onEntryClick={onEntryClick} value={curPage+1} title="Go to Next Page" label="&rsaquo;" isDisabled={curPage === numPages} />
            <PaginationEntry data-pagination-next onEntryClick={onEntryClick} value={numPages} title="Go to Last Page" label="&raquo;" isDisabled={curPage === numPages} />
        </ul>
    );
}

ReactDOM.render(
    <Pagination curPage={25} numPages={50} onEntryClick={(val) => { console.log(val)}} />,
    document.getElementById('root')
);

许可证

@bramus/pagination-sequence 以麻省理工学院公共许可证发放。 见附件 LICENSE 详细情况.

其他语言执行

以另一种编程语言寻求执行?

版本与发布记录

@bramus/pagination-sequence 共发布 11 个版本,首次发布于 2021/12/06;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.2.1latest2023/07/193 年前
1.2.02022/02/204 年前
1.1.22021/12/184 年前
1.1.2-beta.0beta2021/12/184 年前
1.1.12021/12/184 年前
1.1.02021/12/184 年前

关于 @bramus/pagination-sequence 的常见问题

@bramus/pagination-sequence 是什么?

生成一个数字序列, 用于 Pagination 组件, 聪明的方法 .

如何安装 @bramus/pagination-sequence?

在项目目录运行 npm install @bramus/pagination-sequence,或使用 pnpm add / yarn add / bun add。

@bramus/pagination-sequence 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/bramus__pagination-sequence 是否存在。

@bramus/pagination-sequence 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@bramus/pagination-sequence 可以商用吗?

@bramus/pagination-sequence 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@bramus/pagination-sequence 的下载量有多少?

根据 npm 官方下载统计,@bramus/pagination-sequence 在 2026/10/09 – 2026/11/07 这 30 天内被下载 10,763 次,日均约 359 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bramus/pagination-sequence 还在维护吗?

最新版本 1.2.1 发布于 2023/07/19(3 年前);至今共发布 11 个版本,其中过去 12 个月发布了 0 个;首次发布于 2021/12/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。