第一个 Chakra UI 应用 #
创建登录页面 #
让我们通过创建一个登录页面来学习 Chakra UI 的基本用法。
基础结构 #
jsx
import {
Box,
Button,
FormControl,
FormLabel,
Input,
VStack,
Heading,
Text,
Link,
} from '@chakra-ui/react'
function LoginPage() {
return (
<Box
minH="100vh"
display="flex"
alignItems="center"
justifyContent="center"
bg="gray.50"
>
<Box
bg="white"
p={8}
borderRadius="lg"
boxShadow="lg"
w="full"
maxW="md"
>
<VStack spacing={6}>
<Heading size="lg">欢迎登录</Heading>
<FormControl>
<FormLabel>邮箱地址</FormLabel>
<Input type="email" placeholder="your@email.com" />
</FormControl>
<FormControl>
<FormLabel>密码</FormLabel>
<Input type="password" placeholder="********" />
</FormControl>
<Button colorScheme="blue" w="full">
登录
</Button>
<Text>
还没有账号?{' '}
<Link color="blue.500" href="#">
立即注册
</Link>
</Text>
</VStack>
</Box>
</Box>
)
}
export default LoginPage
组件解析 #
Box 组件 #
Box 是最基础的布局组件,相当于一个带样式的 div:
jsx
<Box
p={4} // padding: 16px
m={2} // margin: 8px
bg="blue.500" // background-color
color="white" // text color
borderRadius="md" // border-radius
>
Box 内容
</Box>
VStack 组件 #
VStack 用于垂直堆叠子元素,并自动添加间距:
jsx
<VStack spacing={4}>
<Box>项目 1</Box>
<Box>项目 2</Box>
<Box>项目 3</Box>
</VStack>
Button 组件 #
Button 提供了丰富的样式变体:
jsx
<Button colorScheme="blue">主要按钮</Button>
<Button colorScheme="red">危险按钮</Button>
<Button colorScheme="green">成功按钮</Button>
<Button variant="outline">轮廓按钮</Button>
<Button variant="ghost">幽灵按钮</Button>
Input 组件 #
Input 用于文本输入:
jsx
<Input placeholder="请输入内容" />
<Input type="email" placeholder="邮箱地址" />
<Input type="password" placeholder="密码" />
<Input isInvalid placeholder="错误状态" />
<Input isDisabled placeholder="禁用状态" />
创建导航栏 #
让我们创建一个导航栏组件:
jsx
import {
Box,
Flex,
Text,
Button,
IconButton,
HStack,
Link,
} from '@chakra-ui/react'
import { HamburgerIcon } from '@chakra-ui/icons'
function Navbar() {
return (
<Box bg="white" px={4} shadow="sm">
<Flex h={16} alignItems="center" justifyContent="space-between">
<Text fontSize="xl" fontWeight="bold" color="blue.500">
MyApp
</Text>
<HStack spacing={4} display={{ base: 'none', md: 'flex' }}>
<Link href="#">首页</Link>
<Link href="#">功能</Link>
<Link href="#">价格</Link>
<Link href="#">关于</Link>
</HStack>
<HStack>
<Button colorScheme="blue" size="sm">
登录
</Button>
<IconButton
display={{ base: 'flex', md: 'none' }}
icon={<HamburgerIcon />}
aria-label="打开菜单"
/>
</HStack>
</Flex>
</Box>
)
}
export default Navbar
创建卡片组件 #
jsx
import {
Box,
Image,
Text,
Badge,
VStack,
HStack,
Button,
} from '@chakra-ui/react'
function ProductCard({ title, price, image, isNew }) {
return (
<Box
maxW="sm"
borderWidth="1px"
borderRadius="lg"
overflow="hidden"
bg="white"
>
<Image src={image} alt={title} />
<Box p={6}>
<VStack align="start" spacing={2}>
<HStack>
<Text fontWeight="bold" fontSize="lg">
{title}
</Text>
{isNew && <Badge colorScheme="green">新品</Badge>}
</HStack>
<Text color="gray.500">商品描述信息</Text>
<HStack justify="space-between" w="full">
<Text fontSize="xl" fontWeight="bold" color="blue.500">
¥{price}
</Text>
<Button size="sm" colorScheme="blue">
加入购物车
</Button>
</HStack>
</VStack>
</Box>
</Box>
)
}
export default ProductCard
创建仪表盘布局 #
jsx
import {
Box,
Flex,
SimpleGrid,
Stat,
StatLabel,
StatNumber,
StatHelpText,
StatArrow,
Card,
CardBody,
Heading,
Text,
} from '@chakra-ui/react'
function Dashboard() {
return (
<Box p={8}>
<Heading mb={6}>仪表盘</Heading>
<SimpleGrid columns={{ base: 1, md: 2, lg: 4 }} spacing={6}>
<Card>
<CardBody>
<Stat>
<StatLabel>总收入</StatLabel>
<StatNumber>¥350,000</StatNumber>
<StatHelpText>
<StatArrow type="increase" />
23.36%
</StatHelpText>
</Stat>
</CardBody>
</Card>
<Card>
<CardBody>
<Stat>
<StatLabel>用户数</StatLabel>
<StatNumber>1,234</StatNumber>
<StatHelpText>
<StatArrow type="increase" />
12.05%
</StatHelpText>
</Stat>
</CardBody>
</Card>
<Card>
<CardBody>
<Stat>
<StatLabel>订单数</StatLabel>
<StatNumber>567</StatNumber>
<StatHelpText>
<StatArrow type="decrease" />
5.23%
</StatHelpText>
</Stat>
</CardBody>
</Card>
<Card>
<CardBody>
<Stat>
<StatLabel>转化率</StatLabel>
<StatNumber>45.67%</StatNumber>
<StatHelpText>
<StatArrow type="increase" />
8.92%
</StatHelpText>
</Stat>
</CardBody>
</Card>
</SimpleGrid>
</Box>
)
}
export default Dashboard
响应式设计 #
Chakra UI 提供了简洁的响应式语法:
jsx
import { Box, Text, Flex } from '@chakra-ui/react'
function ResponsiveExample() {
return (
<Box>
<Text
fontSize={{
base: 'md', // 0-480px
sm: 'lg', // 480px+
md: 'xl', // 768px+
lg: '2xl', // 992px+
xl: '3xl', // 1280px+
}}
>
响应式文字大小
</Text>
<Flex
direction={{ base: 'column', md: 'row' }}
gap={4}
>
<Box bg="blue.500" p={4} flex="1">
项目 1
</Box>
<Box bg="green.500" p={4} flex="1">
项目 2
</Box>
<Box bg="red.500" p={4} flex="1">
项目 3
</Box>
</Flex>
<Box
display={{ base: 'block', md: 'none' }}
bg="yellow.200"
p={4}
mt={4}
>
仅在移动端显示
</Box>
</Box>
)
}
export default ResponsiveExample
完整示例:博客页面 #
jsx
import {
Box,
Container,
Heading,
Text,
Image,
Badge,
VStack,
HStack,
Divider,
Link,
Flex,
} from '@chakra-ui/react'
function BlogPost() {
return (
<Container maxW="container.md" py={8}>
<VStack spacing={6} align="stretch">
<Box>
<HStack mb={4}>
<Badge colorScheme="blue">React</Badge>
<Badge colorScheme="green">教程</Badge>
</HStack>
<Heading size="2xl" mb={4}>
Chakra UI 入门指南
</Heading>
<HStack color="gray.500" fontSize="sm">
<Text>作者:张三</Text>
<Text>•</Text>
<Text>2024年1月15日</Text>
<Text>•</Text>
<Text>阅读时间:5分钟</Text>
</HStack>
</Box>
<Image
src="https://via.placeholder.com/800x400"
alt="封面图"
borderRadius="lg"
/>
<Divider />
<Box lineHeight="tall">
<Text mb={4}>
Chakra UI 是一个简单、模块化且易于访问的 React 组件库。
它提供了构建 React 应用程序所需的所有构建块。
</Text>
<Heading size="md" mb={2}>
为什么选择 Chakra UI?
</Heading>
<Text mb={4}>
Chakra UI 专注于无障碍性、主题化和开发者体验,
让你能够快速构建美观且功能完善的应用程序。
</Text>
</Box>
<Divider />
<Flex justify="space-between">
<HStack>
<Text color="gray.500">标签:</Text>
<Link color="blue.500">#React</Link>
<Link color="blue.500">#ChakraUI</Link>
</HStack>
</Flex>
</VStack>
</Container>
)
}
export default BlogPost
Style Props 快速参考 #
| 属性 | CSS 属性 | 示例 |
|---|---|---|
m, margin |
margin | m={4} |
p, padding |
padding | p={4} |
bg |
background | bg="blue.500" |
color |
color | color="white" |
w, width |
width | w="100%" |
h, height |
height | h="100vh" |
fontSize |
font-size | fontSize="xl" |
borderRadius |
border-radius | borderRadius="md" |
shadow |
box-shadow | shadow="lg" |
下一步 #
现在你已经创建了第一个 Chakra UI 应用,接下来学习 设计系统,深入了解 Chakra UI 的设计理念!
最后更新:2026-03-28