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;
相关推荐
老前端的功夫7 小时前
Vue 3 性能深度解析:从架构革新到运行时的全面优化
javascript·vue.js·架构
天天扭码7 小时前
如何实现流式输出?一篇文章手把手教你!
前端·aigc·ai编程
前端 贾公子7 小时前
vue移动端适配方案 === postcss-px-to-viewport
前端·javascript·html
GISer_Jing8 小时前
AI营销增长:4大核心能力+前端落地指南
前端·javascript·人工智能
明远湖之鱼9 小时前
一种基于 Service Worker 的渐进式渲染方案的基本原理
前端
前端小端长10 小时前
Vue 中 keep-alive 组件的原理与实践详解
前端·vue.js·spring
FeelTouch Labs10 小时前
Nginx核心架构设计
运维·前端·nginx
雪球工程师团队10 小时前
别再“苦力”写后台,Spec Coding “跑” 起来
前端·ai编程
m0_4711996310 小时前
【场景】前端怎么解决离线收银、数据同步异常等场景问题
前端·javascript