难点:
考虑点1:为啥需要分页呢?
答案:按需加载
考虑点2:分页器展示,需要哪些数据(条件)?
答案:需要知道4个参数:pageNo、pageSize、total、continues
考虑点3:为啥continues大多都是奇数个数?
答案:因为对称且好看。
考虑点4:为啥不直接使用ElementUI啥的第三方组件呢?
答案:咱自己要掌握自定义分页功能,因为万一产品经理想要自定义分页规则呢。
考虑点5:如何设计分页器原理?(最难点)
考虑点6:分页组件要注册成为全局组件,因为好多地方会使用它
修改代码:
src/main.js
//全局注册分页组件
import Pagination from '@/components/Pagination'
Vue.component(Pagination.name, Pagination)
src/components/Pagination/index.vue
src/pages/Search/index.vue
import {mapGetters, mapState} from "vuex"
methods: {
//自定义事件的回调函数---获取当前第几页
getPageNo(pageNo) {
//整理带给服务器参数
this.searchParams.pageNo = pageNo;
//再次发请求
this.getData();
}
}
computed:{
//获取search模块展示产品一共多少数据
...mapState({
total: (state) => state.search.searchList.total,
}),
}
问题1:为啥需要分页呢?
答案:按需加载
问题2:分页器展示,需要哪些数据(条件)?
答案:自定义分页器前,需要知道4个参数:
问题3:为啥continues大多都是奇数个数?
答案:因为对称且好看。比如淘宝的分页器,中间7-11是奇数个。
问题4:为啥不直接使用ElementUI啥的第三方组件呢?
答案:咱自己要掌握自定义分页功能,因为万一产品经理想要自定义分页规则呢。
问题5:如何设计分页逻辑?(最难点)
答案:考虑start和end的实现逻辑,以及vue模板中的判断逻辑。
computed: {
//总共多少页
totalPage() {
//向上取证
return Math.ceil(this.total / this.pageSize);
},
//计算出连续的页码的起始数字与结束数字[连续页码的数字:至少是5]
startNumAndEndNum() {
//解构出来,不解构是作为实例身上的属性,不解构没法用,所谓解构:就是要将对象分解为多个属性,这个对象可以是this对象也可以是普通的对象
const {continues, pageNo, totalPage} = this;
//先定义两个变量存储起始数字与结束数字
let start = 0, end = 0;
//连续页码数字5【就是至少五页】,如果出现不正常的现象【就是不够五页】
//不正常现象【总页数没有连续页码多】
if (continues > totalPage) {
start = 1;
end = totalPage;
} else {
//正常现象【连续页码5,但是你的总页数一定是大于等于5的】
//起始数字,注意:parseInt()方法是向下取整
start = pageNo - parseInt(continues / 2);
//结束数字
end = pageNo + parseInt(continues / 2);
//把出现不正常的现象【start数字出现0|负数】纠正,假设pageNo为【1|2】的时候,那么start就会出现【0|负数】
if (start < 1) {
start = 1;
end = continues;
}
//把出现不正常的现象[end数字大于总页码]纠正,假设pageNo为【totalPage | totalPage-1】的时候,那么就会出现end > totalPage
if (end > totalPage) {
end = totalPage;
start = totalPage - continues + 1;
}
}
return {start, end};
},
},
注意点6:计算总共多少页,可以采用Math.ceil(this.total / this.pageSize)向上取整的方式。
注意点7:只有数字的页码才添加点击事件,针对页码为…的不添加点击事件,只会新增v-if判断。
注意点8: