从零开始做一个pagination分页组件


Posted in Javascript onMarch 15, 2017

开始一个组件,毫无目的的写代码是一个不好的习惯,要经历 分析 => 抽象 => 实现 => 应用 四个阶段。

组件DEMO地址:https://github.com/CaptainLiao/zujian/tree/master/pagination

分析需求

当前页码显示前后三页,以及在两端显示上一页、下一页

未显示的地方用 ‘...'代替

举个栗子:

假设总共有30页

当前为第一页:1 2 3 4 ... 30 下一页

当前为第二页:上一页 1 2 3 4 5 ... 30 下一页

当前为第三页:上一页 1 2 3 4 5 6 ... 30 下一页
.

当前为第6页:上一页 1 ... 3 4 5 6 7 8 9 ... 30 下一页
.

当前为第29页:上一页 1 ... 26 27 28 29 30 下一页

当前为第30页:上一页 1 ... 27 28 29 30

抽象

分析上面的例子,发现决定输出的因素有两个:当前页码和总页数。

于是,我们设定一个函数用来表示当前页码的显示内容:

/**
 * @param {Number} page 当前页
 * @param {Number} totalPage 总页数 
 */
function pagination(page, totalPage) {
  var str = '';
  // todo...

  return str;
}

// 运行函数,打印出值

var ret = pagination(4, 30)

console.log(ret)

>上一页 1 2 3 4 5 6 7 ... 30 下一页

实现

输入和输出都有了,接着正式开始撸:

function pagination(page, totalPage) {
  var str = page;
  // 这里实现当前页面显示前后三项功能
  for(var i=1; i< totalPage; i++) {
    if(page-i>1) {
      str = page-i +' '+ str;
    }
    if(page + i < totalPage) {
      str = str + ' ' + (page+i)
    }
  }

  // 以page为中心,向左右扩展

  // 向左,先判断当前page向左的第四个数是否大于 1
  if(page-4 > 1) {
    str = '... ' + page;
  }
  // 继续向左判断
  if(page >1) {
    str = "上一页" + '... ' +1 +' ' +str;
  }
  // 向右,判断当前page向右的第四个数字是否小于 totalPage
  if(page + 4 < totalPage) {
    str = '... '+ str;
  }
  if(page < totalPage) {
    str = str +' ' + totalPage +' '+ '下一页';
  }
  return str;
}

现在,我们可以执行下面的函数,取得我们想要的结果:

var total = 30;
  for(var i = 1; i< total; i++) {
   var ret = showPage(i, total);
   console.log(ret)
  }

至此,我们已经实现了分页的逻辑。

应用

接下来的应用就非常简单了,不外乎是给str 加一些标签和class,于是我们就得到了一个分页组件:

HTML:

<ul id="pagination-list" class="clearfix2">

</ul>

javascript:

function pagination(page, totalPage) {
    var str = '<li class="page-active">'+page+'</li>';
    for(var i=1; i<=3; i++) {
      if(page - i > 1) {
        str = '<li class="page-item">'+(page-i)+'</li>' +' '+ str;
      }
      if(page + i < totalPage) {
        str = str +" "+'<li class="page-item">'+(page+ i)+'</li>'
      }
    }
    if(page-4 >1) {
      str = '<li class="page-item">... </li>' +str;
    }
    if (page >1) {
      str= '<li class="page-up">上一页</li>'+ ' '+'<li class="page-item">1</li>' +' '+ str;
    }

    if(page+4< totalPage) {
      str = str+ '<li class="page-item"> ...</li>';
    }
    if(page < totalPage) {
      str = str + " " +'<li class="page-item">'+totalPage+'</li>' +" " +'<li class="page-down">下一页</li>'
    }
    return str;
  }
  var totalPage = 30;

  var str = pagination(1, totalPage);
  var wrap = $("#pagination-list");
  // 这里引用了 jQuery
  wrap.html(str)
    .on('click', '.page-item', function () {
      var cur = parseInt($(this).text());
      wrap.html(pagination(cur, totalPage));
    });

看看效果吧:

从零开始做一个pagination分页组件

目前来说,进展顺利,但是!还有很多需要优化的地方:样式固定,不能自由更改;初始化和交互混杂在一起,没有对代码进行封装...

又经过一番折腾,这个分页组件终于完成,下载demo:

https://github.com/CaptainLiao/zujian/tree/master/pagination

现在,我们可以这样调用它:

<script>
  // #pagination-list 是组件的父容器,50 是总页数。
  $(function () {
    $("#pagination-list").pagination(50);
  })
</script>

是不是很酸爽呢?

如果继续扩展,我们还可以给组件更多的样式选择......

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript倒计时功能实现代码
Jun 07 Javascript
js+数组实现网页上显示时间/星期几的实用方法
Jan 18 Javascript
js和jquery对dom节点的操作(创建/追加)
Apr 21 Javascript
JavaScript 实现打印,打印预览,打印设置
Dec 30 Javascript
thinkphp 表名 大小写 窍门
Feb 01 Javascript
Validform+layer实现漂亮的表单验证特效
Jan 17 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
Jul 07 Javascript
jquery插件开发之选项卡制作详解
Aug 30 jQuery
基于Vue的移动端图片裁剪组件功能
Nov 28 Javascript
详解JS中统计函数执行次数与执行时间
Sep 04 Javascript
node.js事件轮询机制原理知识点
Dec 22 Javascript
Vuex模块化实现待办事项的状态管理
Mar 15 #Javascript
javascript图片预览和上传(兼容IE)
Mar 15 #Javascript
轻松理解JavaScript之AJAX
Mar 15 #Javascript
jQuery插件ContextMenu自定义图标
Mar 15 #Javascript
JavaScript对象引用与赋值实例详解
Mar 15 #Javascript
jQuery图片瀑布流的简单实现代码
Mar 15 #Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
Mar 15 #Javascript
You might like
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
Prototype Hash对象 学习
2009/07/19 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python中cPickle用法例子分享
2014/01/03 Python
Python简单删除目录下文件以及文件夹的方法
2015/05/27 Python
python 的列表遍历删除实现代码
2020/04/12 Python
Python调用C++程序的方法详解
2017/01/24 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
创业计划书——互联网商机
2014/01/12 职场文书
协议书与合同的区别
2014/04/18 职场文书
师恩难忘教学反思
2014/04/27 职场文书
学校端午节活动方案
2014/08/23 职场文书
毕业证代领委托书
2014/09/26 职场文书
2015年个人思想总结
2015/03/09 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
《秋思》教学反思
2016/02/23 职场文书
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS
使用Java去实现超市会员管理系统
2022/03/18 Java/Android
JavaScript实现九宫格拖拽效果
2022/06/28 Javascript