首页 > 其他分享 >前端自己分页 shadcn, Next

前端自己分页 shadcn, Next

时间:2024-08-29 22:04:28浏览次数:11  
标签:const 分页 pageSize Next RANGE pageNumber shadcn return page

import { usePathname, useSearchParams } from 'next/navigation'

import {
  PaginationContent,
  PaginationEllipsis,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
  Pagination as PaginationShadui
} from '@/components/ui/pagination'
import { cx } from 'class-variance-authority'

const RANGE = 1

interface PaginationProps {
  pageSize: number
  page: number
  setPage: any
}

export default function Pagination({ pageSize, setPage, page = 3 }: PaginationProps) {
  //防止出入字符串
  pageSize = Number(pageSize)
  const pathname = usePathname()
  const searchParams = useSearchParams()
  // const page = Number(searchParams.get('page')) || 1

  const renderPagination = () => {
    let dotBefore = false
    let dotAfter = false

    const renderDotBefore = (index: number) => {
      if (!dotBefore) {
        dotBefore = true
        return (
          <PaginationItem>
            <PaginationEllipsis />
          </PaginationItem>
        )
      }
    }

    const renderDotAfter = (index: number) => {
      if (!dotAfter) {
        dotAfter = true
        return (
          <PaginationItem>
            <PaginationEllipsis />
          </PaginationItem>
        )
      }
    }

    return Array(pageSize)
      .fill(0)
      .map((_, index) => {
        const pageNumber = index + 1
        const isActive = pageNumber === page
        if (page <= RANGE * 2 + 1 && pageNumber > page + RANGE && pageNumber < pageSize - RANGE + 1) {
          return renderDotAfter(index)
        } else if (page > RANGE * 2 + 1 && page < pageSize - RANGE * 2) {
          if (pageNumber < page - RANGE && pageNumber > RANGE) {
            return renderDotBefore(index)
          } else if (pageNumber > page + RANGE && pageNumber < pageSize - RANGE + 1) {
            return renderDotAfter(index)
          }
        } else if (page >= pageSize - RANGE * 2 && pageNumber > RANGE && pageNumber < page - RANGE) {
          return renderDotBefore(index)
        }

        return (
          <PaginationItem key={Math.random()}>
            <PaginationLink
              onClick={() => setPage(pageNumber - 1)}
              className={cx({
                'bg-gary dark:bg-primary text-white   dark:text-secondary pointer-events-none': isActive
              }, 'w-6 h-6 flex  items-center justify-center border border-gray text-gray rounded')}
            >
              {pageNumber}
            </PaginationLink>
          </PaginationItem>
        )
      })
  }

  return (
    <PaginationShadui>
      <PaginationContent>
        <PaginationItem>
          <PaginationPrevious
            onClick={() => setPage((page: number) => page - 1)}
            className={cx({
              'pointer-events-none': page === 1,
            }, 'border-gray border p-0 pl-0.5 flex items-center justify-center h-6 w-6  rounded  text-gary')}
          />
        </PaginationItem>
        {renderPagination()}
        <PaginationItem>
          <PaginationNext
            onClick={() => setPage((page: number) => page + 1)}
            // href={{
            //   pathname,
            //   query: {
            //     page: page + 1
            //   }
            // }}
            className={cx({
              'pointer-events-none': page === pageSize
            }, 'border-gray border p-0 pr-0.5 flex items-center justify-center h-6 w-6  rounded  text-gary')}
          />
        </PaginationItem>
      </PaginationContent>
    </PaginationShadui>
  )
}

 

使用shadcn 的pagination  组件,封装即可,使用如下。

totalPage > 0 && <CommonPagination pageSize={Number(totalPage)} page={page + 1} setPage={setPage} />

 

标签:const,分页,pageSize,Next,RANGE,pageNumber,shadcn,return,page
From: https://www.cnblogs.com/xiaoyaoweb/p/18387620

相关文章

  • CoreNext主题1.5.2免授权 | WordPress主题模板
    CoreNext主题1.5.2免授权 | WordPress主题模板探索无限可能:CoreNext主题1.5.2免授权WordPress主题模板在这个数字化的时代,网站已成为个人品牌和企业展示的窗口。对于那些追求独特风格和高效管理的用户来说,选择一个合适的WordPress主题模板至关重要。今天,我们将深入探讨Core......
  • pageHelper分页插件导致的查询慢的问题优化
    首先在yml中配置mybatis:configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl会进行sql语句打印问题:进行分页查询时pageHelper自动生成的count语句相当于在查询语句外包一层selectcount(1)from(你的查询语句)对于你的查询语句的返回条件中有较......
  • HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容
    背景随着消费电子产品和移动互联网的普及,未成年人互联网普及率96.8%,超过80%的未成年人都拥有自己的上网设备,而如何引导孩子正确上网一直是家长们的担忧。市场上很多电子设备、系统推出了一些未成年人管控能力,却需要家长到各个应用去开启青少年模式,如哔哩哔哩、芒果TV、豆瓣等不同......
  • HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容
    背景随着消费电子产品和移动互联网的普及,未成年人互联网普及率96.8%,超过80%的未成年人都拥有自己的上网设备,而如何引导孩子正确上网一直是家长们的担忧。市场上很多电子设备、系统推出了一些未成年人管控能力,却需要家长到各个应用去开启青少年模式,如哔哩哔哩、芒果TV、豆瓣等不同类......
  • 数据分页的艺术:SQL中的高效实现策略
    数据分页的艺术:SQL中的高效实现策略在处理大量数据时,一次性显示所有记录不仅效率低下,而且用户体验差。因此,分页显示成为了Web和应用程序开发中的一项基本需求。SQL作为数据查询语言,提供了多种实现分页的方法。本文将详细探讨如何在不同数据库系统中使用SQL实现数据的分页显......
  • [Paper Reading] Transfusion: Predict the Next Token and Diffuse Images with One
    Transfusion:PredicttheNextTokenandDiffuseImageswithOneMulti-ModalModellink时间:24.08机构:Waymo&UniversityofSouthernCaliforniaTL;DR提出一种使用混合模态token来训练transformer,名为transfusion,是一种生成式AI模型。主要工作使用了2T的tokens结合语言......
  • 使用 pnpm workspace 和 standalone 模式构建 Next.js 的 Docker 镜像
    引言本文将探讨如何利用pnpmworkspace和standalone模式来构建Next.js应用程序的轻量级Docker镜像。这种方法通过仅在node_modules目录中包含必要的文件,显著减少了最终Docker镜像的大小。Standalone模式简介通常情况下,所有在dependencies中列出的包都会......
  • Review of the BMW ICOM Next
    Here’saquickreviewoftheBMWICOMNextA+B+C,thenewdiagnostictoolmadeinChina:1.PerformanceandBuildQuality:TheICOMNextisnoticeablyfasterthantheolderBMWICOMmodelsandseemstobebetterbuilt.ItcomesequippedwithWi-Fi,whichen......
  • 2024年智能革命:HarmonyOS NEXT与盘古大模型5.0的颠覆性融合
    引言2024年,这一年注定在全球智能设备市场的历史上写下浓墨重彩的一笔。作为全球科技巨头,华为再次以其前瞻性的布局,推动了技术与应用的深度融合。在这个充满变革的时代,华为通过不断扩展的鸿蒙生态系统,重新定义了操作系统与AI技术的结合方式。你是否已经感受到这场变革的力量?在全......
  • 在NextChat中接入SiliconCloud API 体验不同的开源先进大语言模型
    NextChat介绍One-Clicktogetawell-designedcross-platformChatGPTwebUI,withGPT3,GPT4&GeminiProsupport.一键免费部署你的跨平台私人ChatGPT应用,支持GPT3,GPT4&GeminiPro模型。主要功能在1分钟内使用Vercel免费一键部署提供体积极小(~5MB)的跨......