React-页码组件

1.首先封装一个页码组件

1)PaginationField.jsx:

复制代码
import {useState,useEffect} from 'react';
import Pagination from 'react-bootstrap/Pagination';
//import Form from 'react-bootstrap/Form';
import Dropdown  from 'react-bootstrap/Dropdown';
import styles from './Pagination.module.scss';

const PaginationField = ({ totalItems, pageSize, currentPage, onPageChange , onPageSizeChange}) => {
  // 计算总页数
  const totalPages = Math.ceil(totalItems / pageSize);
  // 创建一个数组用于生成分页按钮
  const [pages, setpages] = useState(null);
  const [allPages, setallPages] = useState(null);

  useEffect(
    () => {
      let data=[]
      let allPage=[]
      if(totalPages <= 10){
          for (let i = 1; i <= totalPages; i++) {
            data.push(i);
          }
      }else{
        if (currentPage <= 6) {
          data=[1,2,3,4,5,6,7,8,9,10]
        }else{
          if (currentPage<totalPages-4) {
            for (let i = currentPage-5; i <= currentPage+4; i++) {
              data.push(i);
            }
          }else{
            for (let i = totalPages-9; i <= totalPages; i++) {
              data.push(i);
            }
          }
        }
      }
      for (let i = 1; i <= totalPages; i++) {
        allPage.push(i);
      }
      setpages(data)
      setallPages(allPage)
    },
    [currentPage,totalPages]
  );

  // 改变当前页码的函数
  const handlePageChange = (page) => {
    page=Number(page)
    onPageChange(page);
  };

  // 改变每页的行数的函数
  const handlePageSizeChange = (pageSize) => {
    pageSize=Number(pageSize)
    onPageSizeChange(pageSize);
    onPageChange(1);
  };

  return (
    <div className={styles.container}>
      <div className={styles.flex}>
        Page
        {/* <Form.Select className={styles.selectStyle} onChange={e=>handlePageChange(e.target.value)} value={currentPage}>
          {allPages?allPages.map((page) => (<option key={page} value={page}>{page}</option>)):null}
        </Form.Select> */}
        <Dropdown onSelect={handlePageChange} drop="up">
          <Dropdown.Toggle className={styles.selectStyle}>{currentPage}</Dropdown.Toggle>
          <Dropdown.Menu className={styles.dropdownMenu}>
            {allPages?allPages.map((page) => (<Dropdown.Item key={page} eventKey={page}>{page}</Dropdown.Item>)):null}
          </Dropdown.Menu>
         </Dropdown>
        of {totalPages}
      </div>
      <Pagination className={styles.myPagination}>
        <Pagination.First onClick={() => handlePageChange(1)}/>
        <Pagination.Prev onClick={() => handlePageChange(currentPage-1)} disabled={currentPage == 1}/>
        {pages?pages.map((page) => (
          <Pagination.Item 
            key={page} 
            onClick={() => handlePageChange(page)} 
            active={currentPage == page}   
            linkStyle={currentPage == page?{ 
              backgroundColor: '#a89a72', 
              borderColor: '#a89a72'
            }:undefined}>{page}
          </Pagination.Item>
        )):null}
        <Pagination.Next onClick={() => handlePageChange(currentPage+1)} disabled={currentPage == totalPages}/>
        <Pagination.Last onClick={() => handlePageChange(totalPages)}/>
      </Pagination>
      <div className={styles.flex}>
        Items 
        <Dropdown onSelect={handlePageSizeChange} drop="up">
          <Dropdown.Toggle className={styles.selectStyle}>{pageSize}</Dropdown.Toggle>
          <Dropdown.Menu className={styles.dropdownMenu}>
            <Dropdown.Item eventKey="5">5</Dropdown.Item>
            <Dropdown.Item eventKey="10">10</Dropdown.Item>
            <Dropdown.Item eventKey="20">20</Dropdown.Item>
            <Dropdown.Item eventKey="25">25</Dropdown.Item>
            <Dropdown.Item eventKey="50">50</Dropdown.Item>
            <Dropdown.Item eventKey="100">100</Dropdown.Item>
          </Dropdown.Menu>
         </Dropdown>
      </div>
    </div>
  );
};

export default PaginationField;

2)Pagination.module.scss:

复制代码
.container {
  display: flex;
  justify-content: space-between;
}

.flex {
  display:flex
}

.selectStyle{
  width:60px;
  height:25px;
  border-color: #a89a72;
  cursor: pointer;
  padding: .25rem .75rem;
  font-size: .85rem;
  line-height: 1.3;
  margin:0px 5px;
  color: #a89a72;
  background-color: white;
  // option{
  //   color: #a89a72;
  // }

  // option:checked {
  //   background-color: #a89a72; /* 理论上改变选中项的背景色,但实际效果有限 */
  //   color:white;
  // }
}

.selectStyle:focus{
  box-shadow: 0 0 5px #a89a72; /* 阴影 */
  border-color: #a89a72;
}

.dropdownMenu {
  max-height: 400px; /* 设置你想要的固定高度 */
  overflow-y: auto; /* 启用垂直滚动条,如果内容超出高度 */
  font-size:.85rem;
}


.myPagination{
  li a{
    background: transparent;
    border: 1px solid #a89a72;
    color: #a89a72;
    //transition: background-color 0.3s ease;
  }
  li a:hover{
    color: #a89a72; 
    box-shadow: 0 0 5px #a89a72; /* 阴影 */
  }
  li a:active{
    background-color: #a89a72;
    color:white;
  }
  li a:focus{
    background-color: #a89a72;
    color:white;
  }
}

3)index.js

复制代码
export { default } from './PaginationField.jsx';

2.在主页面中调用这个页码组件

复制代码
import PaginationField from 'components/PaginationField';
import {useState} from 'react';

function PageAppReportView() {
  const [currentPage, setCurrentPage] = useState(1); // 当前页码初始化为1
  const [pageSize, setPageSize]= useState(5); // 每页显示的项目数
  const [totalItems] = useState(300);//总项目数
  const handlePageChange = (page) => {
    setCurrentPage(page);
  };
  const handlePageSizeChange = (pageSize) => {
    setPageSize(pageSize);
  };
  return (
    <>
      <PaginationField 
                totalItems={totalItems} 
                pageSize={pageSize} 
                currentPage={currentPage} 
                onPageChange={handlePageChange} 
                onPageSizeChange={handlePageSizeChange} 
              />
    </>
  );
}

PageAppReportView.getLayout = (page) => <GeneralLayout containerClassName={styles.container}>{page}</GeneralLayout>;

export default PageAppReportView;
相关推荐
早點睡3902 分钟前
基础入门 React Native 鸿蒙跨平台开发:react-native-flash-message 消息提示三方库适配
react native·react.js·harmonyos
程序猿阿伟5 分钟前
《TypeScript中Protobuf到运行时类型安全的转换指南》
javascript·安全·typescript
powerfulhell12 分钟前
寒假python作业5
java·前端·python
木子啊27 分钟前
前端组件化:模板继承拯救发际线
前端
三十_A29 分钟前
零基础通过 Vue 3 实现前端视频录制 —— 从原理到实战
前端·vue.js·音视频
前端小菜袅29 分钟前
PC端原样显示移动端页面方案
开发语言·前端·javascript·postcss·px-to-viewport·移动端适配pc端
Highcharts.js30 分钟前
如何使用Highcharts SVG渲染器?
开发语言·javascript·python·svg·highcharts·渲染器
We་ct31 分钟前
LeetCode 228. 汇总区间:解题思路+代码详解
前端·算法·leetcode·typescript
爱问问题的小李1 小时前
ue 动态 Key 导致组件无限重置与 API 重复提交
前端·javascript·vue.js
码云数智-大飞1 小时前
从回调地狱到Promise:JavaScript异步编程的演进之路
开发语言·javascript·ecmascript