尝试自己动手用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 相关文章推荐
jquery实现盒子下拉效果示例代码
Sep 12 Javascript
javascript中clone对象详解
Dec 03 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
May 05 Javascript
JS实现的走迷宫小游戏完整实例
Jul 19 Javascript
关于定制FileField中的上传文件名称问题
Aug 22 Javascript
jQuery超简单遮罩层实现方法示例
Sep 06 jQuery
微信小程序实现多选功能
Nov 04 Javascript
vue的列表交错过渡实现代码示例
May 05 Javascript
javascript实现5秒倒计时并跳转功能
Jun 20 Javascript
微信小程序使用canvas自适应屏幕画海报并保存图片功能
Jul 25 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
May 23 Javascript
react结合bootstrap实现评论功能
May 30 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获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
关于laravel 子查询 &amp; join的使用
2019/10/16 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
Prototype框架详解
2015/11/25 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
jquery分页插件pagination使用教程
2018/10/23 jQuery
vue实现自定义多选按钮
2020/07/16 Javascript
[00:44]TI7不朽珍藏III——军团指挥官不朽展示
2017/07/15 DOTA
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
使用SAE部署Python运行环境的教程
2015/05/05 Python
Python模拟百度登录实例详解
2016/01/20 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
python自动化办公操作PPT的实现
2021/02/05 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
应用心理学个人求职信范文
2013/12/11 职场文书
优秀公益广告词大全
2014/03/19 职场文书
股份合作协议书
2014/09/10 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
参观邀请函范文
2015/02/02 职场文书
党员活动总结
2015/02/04 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
高一数学教学反思
2016/02/18 职场文书
先进个人事迹材料(2016推荐版)
2016/03/01 职场文书