尝试自己动手用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 fullscreen全屏实现代码
Apr 09 Javascript
jQuery拖拽div实现思路
Feb 19 Javascript
JavaScript取得WEB安全颜色列表的方法
Jul 14 Javascript
JS事件添加和移出的兼容写法示例
Jun 20 Javascript
Vue.js快速入门教程
Sep 07 Javascript
js 颜色选择插件
Jan 23 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
Mar 06 Javascript
jquery仿微信聊天界面
May 06 jQuery
浅谈用Webpack路径压缩图片上传尺寸获取的问题
Feb 22 Javascript
关于vue编译版本引入的问题的解决
Sep 17 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
Aug 07 Javascript
JavaScript实现随机点名程序
Mar 25 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
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
javascript prototype原型操作笔记
2009/12/07 Javascript
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
js中传递特殊字符(+,&amp;)的方法
2014/01/16 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
js实现DOM走马灯特效的方法
2015/01/21 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
详解javascript常用工具类的封装
2018/01/30 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
python原始套接字编程示例分享
2014/02/21 Python
python创建临时文件夹的方法
2015/07/06 Python
Python循环语句中else的用法总结
2016/09/11 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
Python闭包思想与用法浅析
2018/12/27 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
python实现简单飞行棋
2020/02/06 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
大学生写自荐信的技巧
2014/01/08 职场文书
护士求职信
2014/07/05 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
医院科室评语
2015/01/04 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
利用Java连接Hadoop进行编程
2022/06/28 Java/Android