尝试自己动手用react来写一个分页组件(小结)


Posted in Javascript onFebruary 09, 2018

本文介绍了尝试自己动手用react来写一个分页组件(小结),分享给大家,具体如下:

分页效果

在线预览

github地址

效果截图(样式可自行修改):

尝试自己动手用react来写一个分页组件(小结)

构建项目

create-react-app react-paging-component

分页组件

1.子组件

创建 Pagecomponent.js 文件

核心代码:

初始化值

constructor(props) {
    super(props)
    this.state = {
      currentPage: 1, //当前页码
      groupCount: 5, //页码分组,显示7个页码,其余用省略号显示
      startPage: 1, //分组开始页码
      totalPage:1 //总页数
    }
  }

动态生成页码函数

createPage() {
    const {currentPage, groupCount, startPage,totalPage} = this.state;
    let pages = []
    //上一页
    pages.push(<li className={currentPage === 1 ? "nomore" : null} onClick={this.prePageHandeler.bind(this)}
            key={0}>
      上一页</li>)

    if (totalPage <= 10) {
      /*总页码小于等于10时,全部显示出来*/
      for (let i = 1; i <= totalPage; i++) {
        pages.push(<li key={i} onClick={this.pageClick.bind(this, i)}
                className={currentPage === i ? "activePage" : null}>{i}</li>)
      }
    } else {
      /*总页码大于10时,部分显示*/

      //第一页
      pages.push(<li className={currentPage === 1 ? "activePage" : null} key={1}
              onClick={this.pageClick.bind(this, 1)}>1</li>)

      let pageLength = 0;
      if (groupCount + startPage > totalPage) {
        pageLength = totalPage
      } else {
        pageLength = groupCount + startPage;
      }
      //前面省略号(当当前页码比分组的页码大时显示省略号)
      if (currentPage >= groupCount) {
        pages.push(<li className="" key={-1}>···</li>)
      }
      //非第一页和最后一页显示
      for (let i = startPage; i < pageLength; i++) {
        if (i <= totalPage - 1 && i > 1) {
          pages.push(<li className={currentPage === i ? "activePage" : null} key={i}
                  onClick={this.pageClick.bind(this, i)}>{i}</li>)
        }
      }
      //后面省略号
      if (totalPage - startPage >= groupCount + 1) {
        pages.push(<li className="" key={-2}>···</li>)
      }
      //最后一页
      pages.push(<li className={currentPage === totalPage ? "activePage" : null} key={totalPage}
              onClick={this.pageClick.bind(this, totalPage)}>{totalPage}</li>)
    }
    //下一页
    pages.push(<li className={currentPage === totalPage ? "nomore" : null}
            onClick={this.nextPageHandeler.bind(this)}
            key={totalPage + 1}>下一页</li>)
    return pages;

  }

页码点击函数:

//页码点击
  pageClick(currentPage) {
    const {groupCount} = this.state
    const getCurrentPage = this.props.pageCallbackFn;
    //当 当前页码 大于 分组的页码 时,使 当前页 前面 显示 两个页码
    if (currentPage >= groupCount) {
      this.setState({
        startPage: currentPage - 2,
      })
    }
    if (currentPage < groupCount) {
      this.setState({
        startPage: 1,
      })
    }
    //第一页时重新设置分组的起始页
    if (currentPage === 1) {
      this.setState({
        startPage: 1,
      })
    }
    this.setState({
      currentPage
    })
    //将当前页码返回父组件
    getCurrentPage(currentPage)
  }

上一页和夏夜点击事件

//上一页事件
  prePageHandeler() {
    let {currentPage} = this.state
    if (--currentPage === 0) {
      return false
    }
    this.pageClick(currentPage)
  }

  //下一页事件
  nextPageHandeler() {
    let {currentPage,totalPage} = this.state
    // const {totalPage} = this.props.pageConfig;
    if (++currentPage > totalPage) {
      return false
    }
    this.pageClick(currentPage)
  }

组件渲染到DOM上

render() {
    const pageList = this.createPage();
    return (
      <ul className="page-container">
        {pageList}
      </ul>
    )
  }

2.父组件

创建 Pagecontainer.js 文件

父组件完整代码

import React, {Component} from 'react'
import Pagecomponent from '../components/Pagecomponent'
import data from '../mock/tsconfig.json'

class Pagecontainer extends Component {
  constructor() {
    super()
    this.state = {
      dataList:[],
      pageConfig: {
        totalPage: data.length //总页码
      }
    }
    this.getCurrentPage = this.getCurrentPage.bind(this)
  }
  getCurrentPage(currentPage) {
    this.setState({
      dataList:data[currentPage-1].name
    })
  }
  render() {
    return (
      <div>
        <div>
          {this.state.dataList}
        </div>
        <Pagecomponent pageConfig={this.state.pageConfig}
                pageCallbackFn={this.getCurrentPage}/>
      </div>

    )
  }
}
export default Pagecontainer

至此一个分页组件就开发完了,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript Array扩展实现代码
Oct 14 Javascript
jquery特效 点击展示与隐藏全文
Dec 09 Javascript
非常棒的jQuery图片轮播效果
Apr 17 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
Jul 27 Javascript
Bootstrap基本组件学习笔记之分页(12)
Dec 08 Javascript
jQuery获取选中单选按钮radio的值
Dec 27 Javascript
node使用Koa2搭建web项目的方法
Oct 17 Javascript
Vue2.0用户权限控制解决方案的示例
Feb 10 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
Aug 20 Javascript
VUE 动态组件的应用案例分析
Dec 02 Javascript
JavaScript的console命令使用实例
Dec 03 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 Javascript
在 React、Vue项目中使用SVG的方法
Feb 09 #Javascript
JavaScript比较同一天的时间大小实例代码
Feb 09 #Javascript
vue2.0.js的多级联动选择器实现方法
Feb 09 #Javascript
使用mint-ui实现省市区三级联动效果的示例代码
Feb 09 #Javascript
vue二级路由设置方法
Feb 09 #Javascript
从零开始搭建一个react项目开发
Feb 09 #Javascript
Vue-Router2.X多种路由实现方式总结
Feb 09 #Javascript
You might like
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
jQuery代码优化方法总结
2018/01/29 jQuery
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
JS实现星星海特效
2019/12/24 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
django+echart数据动态显示的例子
2019/08/12 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
python使用Word2Vec进行情感分析解析
2020/07/31 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
html5弹跳球示例代码
2013/07/23 HTML / CSS
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
公积金转移接收函
2014/01/11 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
新文化运动的基本口号
2014/06/21 职场文书
Python Socket编程详解
2021/04/25 Python
5行Python代码实现一键批量扣图
2021/06/29 Python