"use client"
import { ButtonGroup, IconButton, Pagination } from "@chakra-ui/react"
import { LuChevronLeft, LuChevronRight } from "react-icons/lu"
const Demo = () => {
return (
<Pagination.Root count={20} pageSize={2} defaultPage={1}>
<ButtonGroup variant="ghost" size="sm">
<Pagination.PrevTrigger asChild>
<IconButton>
<LuChevronLeft />
</IconButton>
</Pagination.PrevTrigger>
<Pagination.Items
render={(page) => (
<IconButton variant={{ base: "ghost", _selected: "outline" }}>
{page.value}
</IconButton>
)}
/>
<Pagination.NextTrigger asChild>
<IconButton>
<LuChevronRight />
</IconButton>
</Pagination.NextTrigger>
</ButtonGroup>
</Pagination.Root>
)
}
用法
import { Pagination } from "@chakra-ui/react"
<Pagination.Root>
<Pagination.PrevTrigger />
<Pagination.Ellipsis />
<Pagination.Item />
<Pagination.PageText />
<Pagination.NextTrigger />
</Pagination.Root>
快捷方式
Pagination
组件还为常见用例提供了一组快捷方式。
分页项
此组件根据 count
和 pageSize
属性渲染页码。
渲染这个
<Pagination.Items />
是这个的简写形式
<Pagination.Context>
{({ pages }) =>
pages.map((page, index) =>
page.type === "page" ? (
<Pagination.Item key={index} {...page} />
) : (
<Pagination.Ellipsis key={index} index={index} />
),
)
}
</Pagination.Context>
示例
尺寸
使用 size
属性来改变分页的尺寸。
信息
分页尺寸映射到 Button
组件的尺寸。"use client"
import {
ButtonGroup,
For,
IconButton,
Pagination,
Stack,
} from "@chakra-ui/react"
import { LuChevronLeft, LuChevronRight } from "react-icons/lu"
const Demo = () => {
return (
<Stack gap="8">
<For each={["xs", "sm", "md", "lg"]}>
{(size) => (
<Pagination.Root count={20} pageSize={2} defaultPage={1} key={size}>
<ButtonGroup variant="ghost" size={size}>
<Pagination.PrevTrigger asChild>
<IconButton>
<LuChevronLeft />
</IconButton>
</Pagination.PrevTrigger>
<Pagination.Items
render={(page) => (
<IconButton variant={{ base: "ghost", _selected: "outline" }}>
{page.value}
</IconButton>
)}
/>
<Pagination.NextTrigger asChild>
<IconButton>
<LuChevronRight />
</IconButton>
</Pagination.NextTrigger>
</ButtonGroup>
</Pagination.Root>
)}
</For>
</Stack>
)
}
变体
使用 variant
属性来控制分页项和省略号的变体。
变体与 Button
组件的变体匹配。
"use client"
import { ButtonGroup, IconButton, Pagination } from "@chakra-ui/react"
import { LuChevronLeft, LuChevronRight } from "react-icons/lu"
const Demo = () => {
return (
<Pagination.Root count={20} pageSize={2} defaultPage={1}>
<ButtonGroup variant="outline" size="sm">
<Pagination.PrevTrigger asChild>
<IconButton>
<LuChevronLeft />
</IconButton>
</Pagination.PrevTrigger>
<Pagination.Items
render={(page) => (
<IconButton variant={{ base: "outline", _selected: "solid" }}>
{page.value}
</IconButton>
)}
/>
<Pagination.NextTrigger asChild>
<IconButton>
<LuChevronRight />
</IconButton>
</Pagination.NextTrigger>
</ButtonGroup>
</Pagination.Root>
)
}
受控
使用 page
和 onPageChange
属性来控制当前页面。
"use client"
import { ButtonGroup, IconButton, Pagination } from "@chakra-ui/react"
import { useState } from "react"
import { HiChevronLeft, HiChevronRight } from "react-icons/hi"
const Demo = () => {
const [page, setPage] = useState(1)
return (
<Pagination.Root
count={20}
pageSize={2}
page={page}
onPageChange={(e) => setPage(e.page)}
>
<ButtonGroup variant="ghost" size="sm">
<Pagination.PrevTrigger asChild>
<IconButton>
<HiChevronLeft />
</IconButton>
</Pagination.PrevTrigger>
<Pagination.Items
render={(page) => (
<IconButton variant={{ base: "ghost", _selected: "outline" }}>
{page.value}
</IconButton>
)}
/>
<Pagination.NextTrigger asChild>
<IconButton>
<HiChevronRight />
</IconButton>
</Pagination.NextTrigger>
</ButtonGroup>
</Pagination.Root>
)
}
兄弟页数
使用 siblingCount
控制当前页码前后显示的兄弟页码数量。
"use client"
import { ButtonGroup, IconButton, Pagination } from "@chakra-ui/react"
import { LuChevronLeft, LuChevronRight } from "react-icons/lu"
const Demo = () => {
return (
<Pagination.Root
count={200}
pageSize={10}
defaultPage={10}
siblingCount={2}
>
<ButtonGroup variant="ghost" size="sm">
<Pagination.PrevTrigger asChild>
<IconButton>
<LuChevronLeft />
</IconButton>
</Pagination.PrevTrigger>
<Pagination.Items
render={(page) => (
<IconButton variant={{ base: "ghost", _selected: "outline" }}>
{page.value}
</IconButton>
)}
/>
<Pagination.NextTrigger asChild>
<IconButton>
<LuChevronRight />
</IconButton>
</Pagination.NextTrigger>
</ButtonGroup>
</Pagination.Root>
)
}
紧凑型
使用 Pagination.PageText
创建紧凑型分页。这对于移动视图很有用。
import { ButtonGroup, IconButton, Pagination } from "@chakra-ui/react"
import { HiChevronLeft, HiChevronRight } from "react-icons/hi"
const Demo = () => {
return (
<Pagination.Root count={20} pageSize={2} defaultPage={1}>
<ButtonGroup gap="4" size="sm" variant="ghost">
<Pagination.PrevTrigger asChild>
<IconButton>
<HiChevronLeft />
</IconButton>
</Pagination.PrevTrigger>
<Pagination.PageText />
<Pagination.NextTrigger asChild>
<IconButton>
<HiChevronRight />
</IconButton>
</Pagination.NextTrigger>
</ButtonGroup>
</Pagination.Root>
)
}
作为链接
这是将分页渲染为链接的示例。
"use client"
import {
ButtonGroup,
IconButton,
type IconButtonProps,
Pagination,
usePaginationContext,
} from "@chakra-ui/react"
import { HiChevronLeft, HiChevronRight } from "react-icons/hi"
const PaginationLink = (
props: IconButtonProps & { page?: "prev" | "next" | number },
) => {
const { page, ...rest } = props
const pagination = usePaginationContext()
const pageValue = () => {
if (page === "prev") return pagination.previousPage
if (page === "next") return pagination.nextPage
return page
}
return (
<IconButton asChild {...rest}>
<a href={`?page=${pageValue()}`}>{props.children}</a>
</IconButton>
)
}
const Demo = () => {
return (
<Pagination.Root count={20} pageSize={2} defaultPage={1}>
<ButtonGroup variant="ghost" size="sm">
<PaginationLink page="prev">
<HiChevronLeft />
</PaginationLink>
<Pagination.Items
render={(page) => (
<PaginationLink
page={page.value}
variant={{ base: "ghost", _selected: "outline" }}
>
{page.value}
</PaginationLink>
)}
/>
<PaginationLink page="next">
<HiChevronRight />
</PaginationLink>
</ButtonGroup>
</Pagination.Root>
)
}
附加
这是将分页与 Group
组件组合以附加分页项和触发器的示例。
"use client"
import { ButtonGroup, IconButton, Pagination } from "@chakra-ui/react"
import { HiChevronLeft, HiChevronRight } from "react-icons/hi"
const Demo = () => {
return (
<Pagination.Root count={20} pageSize={2} defaultPage={1}>
<ButtonGroup attached variant="outline" size="sm">
<Pagination.PrevTrigger asChild>
<IconButton>
<HiChevronLeft />
</IconButton>
</Pagination.PrevTrigger>
<Pagination.Items
render={(page) => (
<IconButton
variant={{ base: "outline", _selected: "solid" }}
zIndex={{ _selected: "1" }}
>
{page.value}
</IconButton>
)}
/>
<Pagination.NextTrigger asChild>
<IconButton>
<HiChevronRight />
</IconButton>
</Pagination.NextTrigger>
</ButtonGroup>
</Pagination.Root>
)
}
计数文本
将 format="long"
传递给 Pagination.PageText
组件以显示计数文本。
import { ButtonGroup, IconButton, Pagination } from "@chakra-ui/react"
import { LuChevronLeft, LuChevronRight } from "react-icons/lu"
const Demo = () => {
return (
<Pagination.Root count={50} pageSize={5} defaultPage={1} maxW="240px">
<ButtonGroup variant="ghost" size="sm" w="full">
<Pagination.PageText format="long" flex="1" />
<Pagination.PrevTrigger asChild>
<IconButton>
<LuChevronLeft />
</IconButton>
</Pagination.PrevTrigger>
<Pagination.NextTrigger asChild>
<IconButton>
<LuChevronRight />
</IconButton>
</Pagination.NextTrigger>
</ButtonGroup>
</Pagination.Root>
)
}
数据驱动
这是控制分页状态并使用该状态来分块数据的示例。
Lorem ipsum dolor sit amet 1
Lorem ipsum dolor sit amet 2
Lorem ipsum dolor sit amet 3
Lorem ipsum dolor sit amet 4
Lorem ipsum dolor sit amet 5
"use client"
import {
ButtonGroup,
IconButton,
Pagination,
Stack,
Text,
} from "@chakra-ui/react"
import { useState } from "react"
import { HiChevronLeft, HiChevronRight } from "react-icons/hi"
const pageSize = 5
const count = 50
const items = new Array(count)
.fill(0)
.map((_, index) => `Lorem ipsum dolor sit amet ${index + 1}`)
const Demo = () => {
const [page, setPage] = useState(1)
const startRange = (page - 1) * pageSize
const endRange = startRange + pageSize
const visibleItems = items.slice(startRange, endRange)
return (
<Stack gap="4">
<Stack>
{visibleItems.map((item) => (
<Text key={item}>{item}</Text>
))}
</Stack>
<Pagination.Root
count={count}
pageSize={pageSize}
page={page}
onPageChange={(e) => setPage(e.page)}
>
<ButtonGroup variant="ghost" size="sm">
<Pagination.PrevTrigger asChild>
<IconButton>
<HiChevronLeft />
</IconButton>
</Pagination.PrevTrigger>
<Pagination.Items
render={(page) => (
<IconButton variant={{ base: "ghost", _selected: "outline" }}>
{page.value}
</IconButton>
)}
/>
<Pagination.NextTrigger asChild>
<IconButton>
<HiChevronRight />
</IconButton>
</Pagination.NextTrigger>
</ButtonGroup>
</Pagination.Root>
</Stack>
)
}
属性
根
属性 | 默认值 | 类型 |
---|---|---|
count * | 数字 数据项总数 | |
page | '1' | 数字 当前激活页 |
pageSize | '10' | 数字 每页数据项数量 |
siblingCount | '1' | 数字 活动页旁边显示的页码数量 |
type | '\'button\'' | 'button' | 'link' 触发元素的类型 |
asChild | ||
defaultPage | 数字 分页首次渲染时的初始页码。当您不需要控制分页状态时使用。 | |
ids | Partial<{ root: string ellipsis(index: number): string prevTrigger: string nextTrigger: string item(page: number): string }> 手风琴中元素的 ID。用于组合时很有用。 | |
onPageChange | (details: PageChangeDetails) => void 页码改变时调用 | |
onPageSizeChange | (details: PageSizeChangeDetails) => void 页码大小改变时调用 | |
translations | IntlTranslations 指定标识可访问性元素及其状态的本地化字符串 |