在很多 web 应用中,一个常见的功能是数据分页。无论是电子商务网站还是社交媒体,我们都可以看到数据分页的应用。Angular 是一个非常流行的前端框架,有了 Angular,实现分页功能会变得非常容易,本文将会实现一个简单但完整的分页组件。
概念介绍
在开始实现之前,我们需要了解一些基本概念。
- 每页显示数据的数量:这是用户可以设置的选项,通常是一个下拉列表,可以让用户选择每页显示多少条数据。
- 当前页码:分页组件需要知道当前显示的是哪一页的数据。用户可以通过翻页按钮来改变当前页码。通常也会显示一个输入框,用户可以直接输入页码进入想要查看的页面。
- 总页数:在用户选择每页数据数量的时候,需要计算出总页数,用于在组件中显示。
- 数据总量:用于计算总页数。
分页组件实现
创建组件
使用 Angular 的 CLI 工具可以快速创建分页组件:
-- - - ----------
这会自动创建一个名为 pagination 的组件。
添加模板
现在我们需要在模板中添加一些元素。我们将使用 Bootstrap 4 中的分页样式,因此需要添加以下元素:
---- ---------------- ---------- --------- --- ------------------- --- ------------------ -- ----------------- ---------------------- ----- --------------------------------- ---- ----- --- -------------------- ----------------- ------------------- --- -------------------- ----------------- ------------------- --- -------------------- ----------------- ------------------- --- ------------------ -- ----------------- ------------------ ----- --------------------------------- ---- ----- ----- ------
这是最简单的分页组件样式,由一个包含分页元素的 <ul>
标签和一个用于翻页的 <nav>
标签组成。我们会在后续的代码中,动态地生成 <li>
标签来显示每一页的数据。
添加输入框和下拉列表
用户需要选择每页显示的数据数量,并可以直接输入页码来跳转到想要查看的页面。因此我们需要添加两个元素:一个下拉列表和一个输入框。
---- ----------------- ------- ---------- ------------- ---------------- ------------- -------------------------- ---------------------- -------------------- --------------------- - ---- ----------- ------- --------- ---- --------------------- ---------------------------------------- ------- ----------- ------------- -- --------------- --- - - ------ --------------------- ------------ ------- ------------- --- ------- -- -------------------------------------- - -- ------------- -- --------- ------ ------ ------ ----------- -------------------- ------------------------- ---------------------------- ------------------ ---- ------- ------------- ------ ------------ ------ --
在组件类中,我们需要定义两个变量:perPage
和 currentPage
,分别代表每页显示数据的数量和当前页面的页码。在组件的构造函数中,我们需要初始化这些变量:
------- - --- ----------- - -- -------------- - --- --- --- --- -----
perPageOptions
包含了选择每页显示数据数量时可以选择的选项,用户可以在下拉列表中进行选择。
添加页码
我们需要根据数据总量和每页显示的数据数量来计算总页数,然后动态地生成对应数量的页码元素。另外,当用户点击页码时,我们需要更新 currentPage
变量并重新渲染页面。
在组件的 ngOnInit
钩子函数中,我们可以计算出总页数:
---------- - ------------------------- - --------------
接下来,我们需要动态地生成每一页的页码元素:
------------- ----------------- - --- --- ----------------- ------------ --------- ----------- --- - -- ------------------------------- - --- - -- ----------------- ---------------------- ----- --------------------------------- ---- ----- --- ----------------- ----------- ---------- -- ----------------- --- - - ------ ------------ ------- ----------- --- ---------- -- -------------------------------- - -- -------------------- ---------- ------ ----- --- ----------------- ------------ --------- ----------- --- ---------- -- ------------------------------- - --- - -- ----------------- ------------------ ----- --------------------------------- ---- ----- ---------------
在上面的代码中,我们使用了一个 getPageNumbers()
函数来动态生成页码元素。该函数的实现如下:
---------------- - ----- ----------- - --- --- ---- - - -- - -- ---------------- ---- - -- - - --- - -- - --- --------------- -- -- -- ---------------- - - -- - -- ---------------- - -- - - -------------------- - - ------ ------------ -
这个函数可以根据总页数和当前页码,按顺序生成一个包含所有应该显示的页码的数组。上面的实现中,我们只显示当前页码前后两个页面,以及第一页和最后一页。
添加事件处理
最后,我们需要添加事件处理函数来更新组件中的变量和重新渲染页面。
---------------------- ------- - ------------ - -------- ---------------- - -- --------------- - ------------------------- - -------------- ------------------------ -------- ------------- ------------ ---------------- --- - ----------------------- ------- - -- ------------ - -- ----------- - - -- ---------- - ---------------- - ------- - ---------------- - ----------- - ---- - ---------------- - ------------------ - ------------------------ -------- ------------- ------------ ---------------- --- -
这里有两个事件处理函数:changePerPage()
和 changePage()
。changePerPage()
函数会在用户选择每页显示数据数量时被调用,它会更新 perPage
和 currentPage
变量,并重新计算总页数。changePage()
函数会在用户点击页码时被调用,它会更新 currentPage
变量,并检查页面是否存在(页码不得小于 1 或大于总页数)。
示例代码
------ - ---------- ------------- ------ ------- ------ - ---- ---------------- ------------ --------- ----------------- ------------ ------------------------------ ---------- -------------------------------- -- ------ ----- ------------------- ---------- ------ - -------- ----------- ------- --------- ------------ - --- --------------- ------- - --- ----------- - -- -------------- - --- --- --- --- ----- ---------- - -- ------------- -- ----------- ---- - --------------- - ------------------------- - -------------- - ---------------------- ------- - ------------ - -------- ---------------- - -- --------------- - ------------------------- - -------------- ------------------------ -------- ------------- ------------ ---------------- --- - ----------------------- ------- - -- ------------ - -- ----------- - - -- ---------- - ---------------- - ------- - ---------------- - ----------- - ---- - ---------------- - ------------------ - ------------------------ -------- ------------- ------------ ---------------- --- - ---------------- - ----- ----------- - --- --- ---- - - -- - -- ---------------- ---- - -- - - --- - -- - --- --------------- -- -- -- ---------------- - - -- - -- ---------------- - -- - - -------------------- - - ------ ------------ - -
---- ---------------- ---------- --------- --- ------------------- --- ----------------- ------------ --------- ----------- --- - -- ------------------------------- - ---- -- ----------------- ---------------------- ----- --------------------------------- ---- ----- --- ----------------- ----------- ---------- -- ----------------- --- - - ------ ------------ ------- ----------- --- ---------- -- --------------------------------- -- -------------------- ---------- ------ ----- --- ----------------- ------------ --------- ----------- --- ---------- -- ------------------------------- - ---- -- ----------------- ------------------ ----- --------------------------------- ---- ----- ----- ------ ---- ----------------- ------- ---------- ------------- ---------------- ------------- -------------------------- ---------------------- -------------------- ---------------------- ---- ----------- ------- --------- ---- --------------------- ---------------------------------------- ------- ----------- ------------- -- --------------- --- - - ------ --------------------- ------------ ------- ------------- --- ------- -- --------------------------------------- -- ------------- -- --------- ------ ------ ------ ----------- -------------------- ------------------------- ---------------------------- ------------------ ---- ------- ------------- ------ ------------ ------ --
总结
本文介绍了如何使用 Angular 实现一个简单但完整的分页组件。这个组件包含了页码元素、下拉列表、输入框等多个功能。虽然前端中存在很多成熟的分页组件,但自己手动实现一个分页组件将使你更深入地了解分页的实现原理,对于理解前端技术也十分有益。
来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/647c59db968c7c53b076e4e8