课程列表
介绍
分页是前端页面中必不可少的一项功能,下面让我们一起来完成一个课程列表的分页吧。
目标
- 完成数据请求(数据来源
js/carlist.json
)。在项目目录下已经提供了axios
,考生可自行选择是否使用。 - 完成数据分页显示,每页 5 条数据,默认当前页码为第一页(即
pageNum = 1
),按照顺序第一页显示 1-5 条,第二页显示 6-10 条,依此类推。将每条数据显示到list-group
元素中。使用已有代码中list-group
,不要修改list-group
元素的 DOM 结构。动态渲染时,list-group
示例代码可删除。 - 当页码为第一页时,上一页为禁用状态(
class=disabled
),点击无任何变化。 - 当页码为最后一页时,下一页为禁用状态(
class=disabled
),点击无任何变化。 - 在
id
为pagination
元素中正确显示当前页码和总页码(即最大页码)。当前页码变量使用pageNum
,总页码变量使用maxPage
。请勿修改当前页码和总页码的变量名称,以免造成判题无法通过。
代码答案
let pageNum = 1; // 当前页码,默认页码1
let maxPage; // 最大页数
// TODO:待补充代码
// 显示当前页码
function showPagination(maxPage,pageNum){
//字符串中嵌入变量用 ` ` 这用${} 括号里的内容才能显示出来
document.querySelector('#pagination').innerHTML = `共${maxPage}页,当前${pageNum}页`
}
function getPageData(data){
return data.slice((pageNum - 1)*5,pageNum*5)
}
// toFixed(num) 方法可把 Number 四舍五入为指定小数位数的数字,num 为保留小数点的位数
// 渲染每页数据
function renderHtml(pageData){
document.querySelector('#list').innerHTML = pageData.map(item =>`
<!-- list-group 起始位置 list-group为示例代码,动态渲染时可删除-->
<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">${item.name}</h5>
<small>${(item.price / 100).toFixed(2)}元</small>
</div>
<p class="mb-1">
${item.description}
</p>
</a>
</div>
<!-- list-group 结束位置 -->
`).join(``)
}
let data //总数据
let pageData //每页数据
axios.get('./js/carlist.json')
.then(res=>{
data = res.data;//把获得的carlist.json里 是数据(res.data)赋给总数据data
console.log(data);
maxPage = Math.ceil(data.length / 5);//ceil 向上取整
console.log(maxPage,pageNum);
// 显示当前页码
showPagination(maxPage,pageNum)
// 得到每页数据
pageData = getPageData(data)
console.log(pageData)
//渲染每页代码
renderHtml(pageData)
})
// 点击上一页
let prev = document.getElementById("prev");
prev.onclick = function () {
// TODO:待补充代码
next.classList.remove('disabled')
pageNum--
console.log(pageNum)
if(pageNum <= 1){
this.classList.add('disabled')
pageNum = 1
}
// 显示当前页码
showPagination(maxPage,pageNum)
// 得到每页数据
pageData = getPageData(data)
console.log(pageData)
//渲染每页代码
renderHtml(pageData)
};
// 点击下一页
let next = document.getElementById("next");
next.onclick = function () {
// TODO:待补充代码
prev.classList.remove('disabled')
pageNum++
console.log(pageNum)
if(pageNum >= maxPage){
this.classList.add('disabled')
pageNum = maxPage
}
// 显示当前页码
showPagination(maxPage,pageNum)
// 得到每页数据
pageData = getPageData(data)
console.log(pageData)
//渲染每页代码
renderHtml(pageData)
};
知识点
-
从前端请求后端接口获取数据格式:
GET方法:
1、axios.get(url,config).then(res=>{数据处理逻辑}).catch(err=>{错误处理逻辑})
2、axios({method:'get',url:'xxxxx',config}).then(res=>{数据处理逻辑}).catch(err=>{错误处理逻辑})
可以在config中设置基础URL,超时时间、传参方式、请求头等信息,但是传参方式一般为params,请求参数在url中。
-
原生js——操作类名(HTML5新增classList)
classList.add( newClassName );
添加新的类名,如已经存在,取消添加
classList.contains( oldClassName );
确定元素中是否包含指定的类名,返回值为true 、false;
classList.remove( oldClassName );
移除已经存在的类名;
classList.toggle( className );
如果classList中存在给定的值,删除它,否则,添加它;
classList.replace( oldClassName,newClassName );
类名替换
-
字符串中嵌入变量用 ` ` 这用${} 括号里的内容才能显示出来
-
toFixed(num) 方法可把 Number 四舍五入为指定小数位数的数字,num 为保留小数点的位数
-
取整函数主要有三种:ceil()、floor()、round()
1、Math.round()
功能:四舍五入取整。
语法:Math.round(x)
参数:
x:一个浮点数。
返回值:与x最接近的整数。
注:当出现两个最接近的整数,将返回最大的那个整数。
2、Math.floor()
功能:对一个数进行下取整。
-
Math.floor(1.5);//1
-
Math.floor(1.7);//1
3、Math.ceil()
功能:对一个数进行上取整。
-
Math.ceil(1.3);//2
-
Math.ceil(1.5);//2
-
Math.ceil(1.7);//2