尝试自己动手用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 相关文章推荐
js获取变量
Aug 24 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
Aug 07 Javascript
js取消单选按钮选中并判断对象是否为空
Nov 14 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
Nov 30 Javascript
bootstrap vue.js实现tab效果
Feb 07 Javascript
vue使用stompjs实现mqtt消息推送通知
Jun 22 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
Jan 24 Javascript
详释JavaScript执行环境与执行栈
Apr 02 Javascript
简单学习5种处理Vue.js异常的方法
Jun 17 Javascript
js实现for循环跳过undefined值示例
Jul 02 Javascript
详解node和ES6的模块导出与导入
Feb 19 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
php set_time_limit(0) 设置程序执行时间的函数
2010/05/26 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
微信小程序实现自定义picker选择器弹窗内容
2020/05/26 Javascript
Python中的迭代器漫谈
2015/02/03 Python
python3使用urllib模块制作网络爬虫
2016/04/08 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
python 换位密码算法的实例详解
2017/07/19 Python
使用python实现knn算法
2017/12/20 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
外贸学院会计专业应届生求职信
2013/11/14 职场文书
自我评价范文分享
2014/01/04 职场文书
技能比赛获奖感言
2014/02/14 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
施工安全协议书范本
2014/09/26 职场文书
四风查摆剖析材料
2014/10/10 职场文书
土建施工员岗位职责
2015/04/11 职场文书
毕业酒会致辞
2015/07/29 职场文书
婚庆答谢词大全
2015/09/29 职场文书