分页是前端页面中必不可少的一项功能,下面让我们一起来完成一个课程列表的分页吧。
开始答题前,需要先打开本题的项目代码文件夹,目录结构如下:
├── css
│ └── bootstrap.css
├── effect.gif
├── index.html
└── js
├── axios.js
├── carlist.json
└── index.js
其中:
css/bootstrap.css
是项目中用到 bootstrap
样式文件。index.html
是主页面。js/carlist.json
是请求需要用到的数据。js/axios.js
是请求需要用到的 axios 文件。js/index.js
是需要补充的 js 文件。effect.gif
是最终效果图。注意:打开环境后发现缺少项目代码,请手动键入下述命令进行下载:
cd /home/project
wget https://labfile.oss.aliyuncs.com/courses/9791/10.zip && unzip 10.zip && rm 10.zip
请通过 VS Code 中的 live server 插件启动本项目,让项目运行起来,效果如下:
注意:一定要通过 live server 插件启动项目,避免项目无法访问,影响做题。
js/carlist.json
)。在项目目录下已经提供了 axios
,考生可自行选择是否使用。pageNum = 1
),按照顺序第一页显示 1-5 条,第二页显示 6-10 条,依此类推。将每条数据显示到 list-group
元素中。使用已有代码中 list-group
,不要修改 list-group
元素的 DOM 结构。动态渲染时,list-group
示例代码可删除。class=disabled
),点击无任何变化。class=disabled
),点击无任何变化。id
为 pagination
元素中正确显示当前页码和总页码(即最大页码)。当前页码变量使用 pageNum
,总页码变量使用 maxPage
。请勿修改当前页码和总页码的变量名称,以免造成判题无法通过。 完成后的效果见文件夹下面的 gif 图,图片名称为 effect.gif
(提示:可以通过 VS Code 或者浏览器预览 gif 图片)。
id
、class
、函数名等名称,以免造成无法判题通过。let pageNum = 1; // 当前页码,默认页码1
let maxPage; // 最大页数
// TODO:待补充代码
let dataList =[]
let list = document.querySelector("#list")
let prev = document.getElementById("prev");
let next = document.getElementById("next");
//入口函数
axios.get("./js/carlist.json").then(res=>{dataList = res.data;
render();})
//渲染函数
function render(){
let content = ''
//按钮调整
disableBtn();
maxPage=Math.ceil(dataList.length/5)
//修改当前页数
renderCurrentAndMax();
let beforeIndex = (pageNum-1)*5
let currentLength = (pageNum == maxPage? dataList.length - beforeIndex : 5)
for(i = beforeIndex;i<beforeIndex+currentLength;i++){
content+=`<div class="list-group">
<a href="#" class="list-group-item list-group-item-action">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">${dataList[i].name} uni-app</h5>
<small>${(dataList[i].price/100).toFixed(2) }元</small>
</div>
<p class="mb-1">
${dataList[i].description}
</p>
</a>
</div>`
}
list.innerHTML = content
}
function disableBtn(){
if(pageNum == 1){
prev.classList.add('disabled')
}else{
prev.classList.remove('disabled')
}
if(pageNum == maxPage){
next.classList.add('disabled')
}else{
next.classList.remove('disabled')
}
}
//在页面中渲染当前页数和总页数
function renderCurrentAndMax(){
let pagination = document.querySelector('#pagination')
pagination.innerHTML = `共${maxPage}页,当前${pageNum}页`
}
// 点击上一页
prev.onclick = function () {
// TODO:待补充代码
if(pageNum == 1){
return
}
pageNum --
render()
};
// 点击下一页
next.onclick = function () {
// TODO:待补充代码
if(pageNum == maxPage){
return
}
pageNum ++
render()
};
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>课程列表</title>
<script src="./js/axios.js"></script>
<link rel="stylesheet" href="./css/bootstrap.css" />
<style>
* {
outline: none;
}
h1 {
text-align: center;
}
</style>
</head>
<body>
<h1>课程列表</h1>
<div id="list">
<!-- list-group 起始位置 list-group为示例代码,动态渲染时可删除-->
<!-- list-group 结束位置 -->
</div>
<div class="container">
<div class="row">
<div class="col-6">
<nav aria-label="Page navigation">
<ul class="pagination">
<li id="prev" class="page-item disabled">
<a class="page-link" href="javascript:void(0)">上一页</a>
</li>
<li id="next" class="page-item">
<a class="page-link" href="javascript:void(0)">下一页</a>
</li>
</ul>
</nav>
</div>
<div class="col">
<div id="pagination"></div>
</div>
</div>
</div>
</body>
<script src="./js/index.js"></script>
</html>
<head>
):
UTF-8
,确保页面能正确显示各种字符。meta
标签保证页面在不同浏览器和设备上能正确显示。axios.js
库,用于发起 HTTP 请求。bootstrap.css
样式文件,为页面提供样式支持。<body>
):
id
为 list
的 div
元素,用于动态渲染课程列表。id
为 pagination
的 div
元素,用于显示当前页码和总页数。index.js
脚本文件,实现页面的交互逻辑。let pageNum = 1; // 当前页码,默认页码1
let maxPage; // 最大页数
// TODO:待补充代码
let dataList =[]
let list = document.querySelector("#list")
let prev = document.getElementById("prev");
let next = document.getElementById("next");
//入口函数
axios.get("./js/carlist.json").then(res=>{dataList = res.data;
render();})
//渲染函数
function render(){
let content = ''
//按钮调整
disableBtn();
maxPage=Math.ceil(dataList.length/5)
//修改当前页数
renderCurrentAndMax();
let beforeIndex = (pageNum-1)*5
let currentLength = (pageNum == maxPage? dataList.length - beforeIndex : 5)
for(i = beforeIndex;i<beforeIndex+currentLength;i++){
content+=`<div class="list-group">
<a href="#" class="list-group-item list-group-item-action">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">${dataList[i].name} uni-app</h5>
<small>${(dataList[i].price/100).toFixed(2) }元</small>
</div>
<p class="mb-1">
${dataList[i].description}
</p>
</a>
</div>`
}
list.innerHTML = content
}
function disableBtn(){
if(pageNum == 1){
prev.classList.add('disabled')
}else{
prev.classList.remove('disabled')
}
if(pageNum == maxPage){
next.classList.add('disabled')
}else{
next.classList.remove('disabled')
}
}
//在页面中渲染当前页数和总页数
function renderCurrentAndMax(){
let pagination = document.querySelector('#pagination')
pagination.innerHTML = `共${maxPage}页,当前${pageNum}页`
}
// 点击上一页
prev.onclick = function () {
// TODO:待补充代码
if(pageNum == 1){
return
}
pageNum --
render()
};
// 点击下一页
next.onclick = function () {
// TODO:待补充代码
if(pageNum == maxPage){
return
}
pageNum ++
render()
};
pageNum
:表示当前页码,默认值为 1。maxPage
:表示最大页数,初始值未定义。dataList
:用于存储从 carlist.json
文件中获取的课程数据。list
:获取 id
为 list
的 div
元素,用于显示课程列表。prev
和 next
:分别获取 “上一页” 和 “下一页” 按钮元素。axios.get
方法从 carlist.json
文件中获取课程数据。dataList
中,并调用 render
函数进行渲染。render
):
content
,用于存储课程列表的 HTML 内容。disableBtn
函数,根据当前页码启用或禁用 “上一页” 和 “下一页” 按钮。maxPage
,每页显示 5 条数据。renderCurrentAndMax
函数,在页面上显示当前页码和总页数。beforeIndex
和当前页的课程数量 currentLength
。content
中。content
赋值给 list
元素的 innerHTML
属性,完成课程列表的渲染。disableBtn
):
renderCurrentAndMax
):
id
为 pagination
的 div
元素。innerHTML
属性。prev.onclick
):若当前页码为 1,则不做处理;否则,将当前页码减 1,并调用 render
函数重新渲染页面。next.onclick
):若当前页码为最大页数,则不做处理;否则,将当前页码加 1,并调用 render
函数重新渲染页面。三、工作流程▶️
axios.js
、bootstrap.css
和 index.js
文件。index.js
中的入口函数通过 axios.get
方法从 carlist.json
文件中获取课程数据。dataList
中,并调用 render
函数进行渲染。render
函数会根据当前页码和每页显示的数量,从 dataList
中提取相应的课程数据,拼接成 HTML 字符串,并插入到 list
元素中。render
函数会调用 disableBtn
函数,根据当前页码启用或禁用 “上一页” 和 “下一页” 按钮。render
函数会调用 renderCurrentAndMax
函数,在页面上显示当前页码和总页数。render
函数重新渲染页面。