Table 表格组件 #
基本用法 #
jsx
import {
Table,
Thead,
Tbody,
Tfoot,
Tr,
Th,
Td,
TableCaption,
TableContainer,
} from '@chakra-ui/react'
function Example() {
return (
<TableContainer>
<Table variant="simple">
<TableCaption>用户数据统计</TableCaption>
<Thead>
<Tr>
<Th>姓名</Th>
<Th>年龄</Th>
<Th isNumeric>薪资</Th>
</Tr>
</Thead>
<Tbody>
<Tr>
<Td>张三</Td>
<Td>25</Td>
<Td isNumeric>¥10,000</Td>
</Tr>
<Tr>
<Td>李四</Td>
<Td>30</Td>
<Td isNumeric>¥15,000</Td>
</Tr>
</Tbody>
<Tfoot>
<Tr>
<Th>总计</Th>
<Th>2人</Th>
<Th isNumeric>¥25,000</Th>
</Tr>
</Tfoot>
</Table>
</TableContainer>
)
}
表格变体 #
jsx
<Table variant="simple">简单表格</Table>
<Table variant="striped">条纹表格</Table>
<Table variant="unstyled">无样式表格</Table>
表格尺寸 #
jsx
<Table size="sm">小表格</Table>
<Table size="md">中等表格(默认)</Table>
<Table size="lg">大表格</Table>
表格颜色 #
jsx
<Table colorScheme="blue">蓝色表格</Table>
<Table colorScheme="green">绿色表格</Table>
<Table colorScheme="red">红色表格</Table>
条纹表格 #
jsx
<Table variant="striped" colorScheme="gray">
<Thead>
<Tr>
<Th>姓名</Th>
<Th>邮箱</Th>
</Tr>
</Thead>
<Tbody>
<Tr>
<Td>张三</Td>
<Td>zhangsan@example.com</Td>
</Tr>
<Tr>
<Td>李四</Td>
<Td>lisi@example.com</Td>
</Tr>
</Tbody>
</Table>
可滚动表格 #
jsx
<TableContainer maxH="300px" overflowY="auto">
<Table>
{/* 表格内容 */}
</Table>
</TableContainer>
实用示例 #
用户列表表格 #
jsx
function UserTable({ users }) {
return (
<TableContainer>
<Table variant="simple">
<Thead>
<Tr>
<Th>用户</Th>
<Th>邮箱</Th>
<Th>角色</Th>
<Th>状态</Th>
<Th>操作</Th>
</Tr>
</Thead>
<Tbody>
{users.map((user) => (
<Tr key={user.id}>
<Td>
<HStack>
<Avatar size="sm" src={user.avatar} />
<Text>{user.name}</Text>
</HStack>
</Td>
<Td>{user.email}</Td>
<Td>
<Badge colorScheme={user.role === 'admin' ? 'purple' : 'gray'}>
{user.role}
</Badge>
</Td>
<Td>
<Badge colorScheme={user.active ? 'green' : 'red'}>
{user.active ? '活跃' : '禁用'}
</Badge>
</Td>
<Td>
<HStack spacing={2}>
<Button size="sm" colorScheme="blue">编辑</Button>
<Button size="sm" colorScheme="red" variant="outline">删除</Button>
</HStack>
</Td>
</Tr>
))}
</Tbody>
</Table>
</TableContainer>
)
}
排序表格 #
jsx
function SortableTable({ data }) {
const [sortField, setSortField] = useState('name')
const [sortOrder, setSortOrder] = useState('asc')
const sortedData = [...data].sort((a, b) => {
if (sortOrder === 'asc') {
return a[sortField] > b[sortField] ? 1 : -1
}
return a[sortField] < b[sortField] ? 1 : -1
})
const handleSort = (field) => {
if (sortField === field) {
setSortOrder(sortOrder === 'asc' ? 'desc' : 'asc')
} else {
setSortField(field)
setSortOrder('asc')
}
}
return (
<TableContainer>
<Table>
<Thead>
<Tr>
<Th cursor="pointer" onClick={() => handleSort('name')}>
<HStack>
<Text>姓名</Text>
{sortField === 'name' && (
<Icon as={sortOrder === 'asc' ? ChevronUpIcon : ChevronDownIcon} />
)}
</HStack>
</Th>
<Th cursor="pointer" onClick={() => handleSort('age')} isNumeric>
<HStack justify="flex-end">
<Text>年龄</Text>
{sortField === 'age' && (
<Icon as={sortOrder === 'asc' ? ChevronUpIcon : ChevronDownIcon} />
)}
</HStack>
</Th>
</Tr>
</Thead>
<Tbody>
{sortedData.map((item) => (
<Tr key={item.id}>
<Td>{item.name}</Td>
<Td isNumeric>{item.age}</Td>
</Tr>
))}
</Tbody>
</Table>
</TableContainer>
)
}
Table 属性速查表 #
| 属性 | 说明 | 值 |
|---|---|---|
| variant | 变体 | simple, striped, unstyled |
| size | 尺寸 | sm, md, lg |
| colorScheme | 颜色方案 | blue, green, gray… |
下一步 #
现在你已经掌握了 Table 组件,接下来学习 List 列表,了解如何展示列表数据!
最后更新:2026-03-28