从零开始做一个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 相关文章推荐
jQuery live
May 15 Javascript
Ruffy javascript 学习笔记
Nov 30 Javascript
Three.js学习之文字形状及自定义形状
Aug 01 Javascript
解决node.js安装包失败的几种方法
Sep 02 Javascript
Servlet实现文件上传,可多文件上传示例
Dec 05 Javascript
JS中去掉array中重复元素的方法
May 26 Javascript
element ui 表格动态列显示空白bug 修复方法
Sep 04 Javascript
uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能
Nov 12 Javascript
Vue学习笔记之计算属性与侦听器用法
Dec 07 Javascript
jQuery实现移动端笔触canvas电子签名
May 21 jQuery
vue实现列表滚动的过渡动画
Jun 29 Javascript
微信小程序实现身份证取景框拍摄
Sep 09 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获取当前url的具体方法全面解析
2013/11/26 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
基于jquery的图片幻灯展示源码
2012/07/15 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
2017/12/11 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
vue实现图片上传功能
2020/05/28 Javascript
Vuex的各个模块封装的实现
2020/06/05 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
python类参数self使用示例
2014/02/17 Python
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
Python操作Jira库常用方法解析
2020/04/10 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
国庆庆典邀请函
2015/02/02 职场文书
《雷雨》教学反思
2016/02/20 职场文书
Python基础之pandas数据合并
2021/04/27 Python
Python基本数据类型之字符串str
2021/07/21 Python
Python学习之迭代器详解
2022/04/01 Python