从零开始做一个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之自定义类型
May 04 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
Jun 23 Javascript
jquery+html仿翻页相册功能
Dec 20 Javascript
AngularJs 常用的过滤器
May 15 Javascript
基于AngularJS的拖拽文件上传的实例代码
Jul 15 Javascript
vue 添加vux的代码讲解
Nov 30 Javascript
js实现搜索栏效果
Nov 16 Javascript
详解微信小程序网络请求接口封装实例
May 02 Javascript
微信小程序云开发使用方法新手初体验
May 16 Javascript
javascript的this关键字详解
May 20 Javascript
js中addEventListener()与removeEventListener()用法案例分析
Mar 02 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
Sep 01 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中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
2013/07/05 PHP
php读取3389的脚本
2014/05/06 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
js实现简单页面全屏
2019/09/17 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
django框架cookie和session用法实例详解
2019/12/10 Python
python3 使用traceback定位异常实例
2020/03/09 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
校园活动策划书范文
2014/01/10 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
学生会竞选演讲稿
2014/04/24 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
重阳节座谈会主持词
2015/07/03 职场文书
大学毕业谢师宴致辞
2015/07/27 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
Java常用函数式接口总结
2021/06/29 Java/Android
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle