尝试自己动手用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 选择器部分整理
Oct 28 Javascript
onkeydown事件解决按回车键直接提交数据的需求
Apr 11 Javascript
简单几行JS Code实现IE邮件转发新浪微博
Jul 03 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
Oct 16 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
Apr 04 Javascript
JavaScript开发人员的10个关键习惯小结
Dec 05 Javascript
基于jQuery实现多层次的手风琴效果附源码
Sep 21 Javascript
javascript对象的相关操作小结
May 16 Javascript
JS实现间歇滚动的运动效果实例
Dec 22 Javascript
javascript获取图片的top N主色值方法详解
Jan 26 Javascript
vue实现选项卡及选项卡切换效果
Apr 24 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
Oct 16 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
写js时遇到的一些小问题
2010/12/06 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
解决使用vue.js路由后失效的问题
2018/03/17 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
Python采集腾讯新闻实例
2014/07/10 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
python中with用法讲解
2020/02/07 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
两道JAVA笔试题
2016/09/14 面试题
人事任命书范文
2014/06/04 职场文书
小学安全汇报材料
2014/08/14 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
员工试用期转正自我评价
2015/03/10 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
职位证明模板
2015/06/23 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android