React实现分页器效果

简介: React实现分页器效果
import React, { Component } from 'react';
import { withRouter } from 'react-router-dom';
class Com extends React.Component{
    constructor(props) {
        super(props)  
        let {defaultCurrent,total} = props;
        this.state = {
            url:this.props.match.path.split('/')[1] || 'home',
            currentPage: defaultCurrent, //当前页码
            groupCount: 5, //页码分组,显示7个页码,其余用省略号显示
            startPage: parseInt(defaultCurrent)-2>0 ? parseInt(defaultCurrent)-2 : parseInt(defaultCurrent), //分组开始页码
            totalPage:total //总页数
        }
    }
    createPage(pageCfg) {
        const {groupCount} = this.state;
        const {currentPage, totalPage,startPage} = pageCfg;
        // 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="omission" 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="omission" 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 {onChange} = this.props;
        //当 当前页码 大于 分组的页码 时,使 当前页 前面 显示 两个页码
        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
        })
        // 缓存当前页码
        sessionStorage.setItem(`currentPage${this.state.url}`, encodeURIComponent(currentPage));
        //将当前页码返回父组件
        onChange(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)
    }
    render(){
        const { defaultCurrent,total } = this.props;
        const localCurrent = parseInt(sessionStorage.getItem(`currentPage${this.state.url}`)) || 1;
        const pageCfg = {
            currentPage: localCurrent || defaultCurrent,
            startPage: localCurrent-2>0 ? localCurrent-2 : localCurrent, //分组开始页码
            totalPage:total //总页数
        }
        return(
            <div className="page_container">
                <ul>
                    {this.createPage(pageCfg)}
                </ul>
            </div>
        )
    }
}
export default withRouter(Com);
相关文章
|
缓存 前端开发 JavaScript
React Table 表格组件使用教程 排序、分页、搜索过滤筛选功能实战开发
在日常开发中,特别是内部使用的后台系统时,我们常常会需要用表格来展示数据,同时提供一些操作用于操作表格内的数据。简单的表格直接用原生 HTML table 就好,但如果要在 React 中实现一个功能丰富的表格,其实是非常不容易的。在本站之前的文章《最好的 6 个 React Table 组件详细亲测推荐》 中有提到过 react-table 这个库,如果对这个库不太了解的同学可以先了解一下,这里不再赘述。简而言之,react-table 是一个非常强大的库,它与常见的表格组件不同,它不负责渲染 HTML 和 CSS,而是提供了一系列的 hooks 让我们可以灵活地构建功能强大的表格组件。
1267 0
|
9月前
从零开始学习React-实现一个表格和分页(九)
从零开始学习React-实现一个表格和分页(九)
60 0
|
API
react+ts+hook封装一个table分页组件(建议收藏,直接使用)
react+ts+hook封装一个table分页组件(建议收藏,直接使用)
161 0
|
API
react+ts+hook封装一个table分页组件(建议收藏,直接使用)(1)
react+ts+hook封装一个table分页组件(建议收藏,直接使用)
103 0
react+ts+hook封装一个table分页组件(建议收藏,直接使用)(2)
react+ts+hook封装一个table分页组件(建议收藏,直接使用)
138 0
|
前端开发
react项目实战学习笔记-学习37-分页请求获取2
react项目实战学习笔记-学习37-分页请求获取2
76 0
react项目实战学习笔记-学习37-分页请求获取2
|
前端开发 开发工具 git
用 React 分页显示数据
用react分页显示数据 去年年底,尝试着用react写个组件化的页面! demo地址 里面有一个list页面弄了一下数据的分页展示 展示一下主要三个组件:父组件listBox、列表组件List、按钮组件PageButton 父组件listBox c...
1658 0
|
3月前
|
设计模式 前端开发 数据可视化
【第4期】一文了解React UI 组件库
【第4期】一文了解React UI 组件库
264 0
|
3月前
|
存储 前端开发 JavaScript
【第34期】一文学会React组件传值
【第34期】一文学会React组件传值
55 0
|
3月前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
90 0