Next.js 分页组件

import React from 'react';
import './NxPagination.less';


export default class NxPagination extends React.Component {


    renderRange(startNo, endNo, foo) {
        var result = [];
        for (var i = startNo; i <= endNo; i++) {
            result.push(foo(i));
        }
        return result;
    }

    renderItem = (pno, text, pageNo) => {
        var {itemRender} = this.props;
        if (itemRender) {
            return itemRender(pno, text, pageNo);
        }

        if (pno === pageNo) {
            return <span>{text}</span>
        }
        return <a href={'?pn=' + pno}>{text}</a>
    };

    render() {
        var that = this;
        var linkcount = 8;
        var {total, pageSize, pageNo, itemRender} = this.props;
        if (pageSize <= 0) {
            pageSize = 1;
        }

        var pageCount = parseInt(total / pageSize, 10);
        if (total % pageSize > 0) {
            pageCount = pageCount + 1;
        }

        if (pageCount < 1) {
            pageCount = 1;
        }


        var startNo = 1;
        var endNo = 10;

        if (pageCount <= linkcount) {
            startNo = 1;
            endNo = pageCount;
        }
        else {

            startNo = pageNo - parseInt(linkcount / 2, 10);
            if (startNo <= 1) {
                startNo = 1;
            }

            endNo = startNo + linkcount - 1;
            if (endNo >= pageCount) {
                endNo = pageCount;
            }
        }


        return (
            <div className='NxPagination'>
                <div className={'firstPn pagelinkitem'}>{that.renderItem(1, 'first', pageNo)}</div>
                <div className='NxPaginationUl'>
                    {that.renderRange(startNo, endNo, function (pn) {
                        if (pageNo === pn) {
                            return <div
                                className={'pagelinkitem pagelinkitemcurrent'}>{that.renderItem(pn, pn, pageNo)}</div>;
                        }
                        return <div className={'pagelinkitem'}>{that.renderItem(pn, pn, pageNo)}</div>;
                    })}
                </div>
                <div className={'lastPn pagelinkitem'}>{that.renderItem(1, 'last', pageNo)}</div>
                <div className={'pageCount'}>共{pageCount}页</div>
                <div className={'total'}>共{total}项</div>
                <div className={'clearfloat'}></div>
            </div>
        )
    }

}

  

 

 

 

.NxPagination {
  * {
    box-sizing: border-box;
    font-size: 12px;
  }

  div {
    float: left;
  }

  div.clearfloat {
    clear: both;
    float: none;
  }

  .pagelinkitem {
    font-weight: 500;
    background: transparent;
    border: 1px solid #d9d9d9;
    text-align: center;
    line-height: 32px;
    min-width: 32px;
    padding: 0 5px;
    margin-right: 8px;
    border-radius: 4px;
  }

  .pagelinkitemcurrent {
    border-color: #379c5d;
  }

  a {
    color: rgba(0, 0, 0, 0.65);
    cursor: pointer;
  }

  span {
    color: #379c5d;
    cursor: default;
  }

  .pageCount, .total {
    line-height: 32px;
    margin-right: 8px;
  }
}

  

转载于:https://www.cnblogs.com/lhp2012/p/10763556.html

Next.js 中实现分页功能可以通过以下步骤进行: 1. 创建一个页面组件(例如 `pages/index.js`),用于显示分页数据。 2. 在页面组件中,使用 Next.js 提供的 `getServerSideProps` 方法来获取初始的分页数据。在这个方法中,您可以调用后端 API 或者读取数据库等方式获取数据。 3. 在页面组件中,使用状态管理(例如 React 的 `useState` 和 `useEffect`)来存储当前页数和总页数等信息。 4. 创建一个翻页组件(例如 `components/Pagination.js`),用于展示分页按钮和处理页码切换的逻辑。 5. 在页面组件中使用翻页组件,并将当前页数和总页数等信息作为 props 传递给翻页组件。 6. 在翻页组件中,添加点击事件处理函数,用于处理点击不同页码时的逻辑。您可以根据当前页数和总页数等信息来计算新的页码,并触发数据更新。 7. 在页面组件中,根据当前页数和分页数据来展示相应的内容。 下面是一个简单的示例代码: **pages/index.js:** ```javascript import { useState, useEffect } from 'react'; import Pagination from '../components/Pagination'; export default function Home() { const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(0); const [data, setData] = useState([]); useEffect(() => { fetchData(currentPage); }, [currentPage]); const fetchData = async (page) => { // 根据页码调用 API 或者读取数据库等方式获取数据 // 更新总页数和当前页的数据 // 示例代码: const response = await fetch(`https://example.com/api/data?page=${page}`); const { totalPages, data } = await response.json(); setTotalPages(totalPages); setData(data); }; const handlePageChange = (page) => { setCurrentPage(page); }; return ( <div> {/* 显示数据 */} <ul> {data.map((item) => ( <li key={item.id}>{item.name}</li> ))} </ul> {/* 显示分页组件 */} <Pagination currentPage={currentPage} totalPages={totalPages} onPageChange={handlePageChange} /> </div> ); } ``` **components/Pagination.js:** ```javascript import React from 'react'; export default function Pagination({ currentPage, totalPages, onPageChange }) { const handlePrevClick = () => { if (currentPage > 1) { onPageChange(currentPage - 1); } }; const handleNextClick = () => { if (currentPage < totalPages) { onPageChange(currentPage + 1); } }; return ( <div> <button onClick={handlePrevClick}>Previous</button> <span>{currentPage}</span> / <span>{totalPages}</span> <button onClick={handleNextClick}>Next</button> </div> ); } ``` 以上代码仅为示例,您可以根据自己的需求进行修改和扩展。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值