import { HStack, RadioCard } from "@chakra-ui/react"
const Demo = () => {
return (
<RadioCard.Root defaultValue="next">
<RadioCard.Label>Select framework</RadioCard.Label>
<HStack align="stretch">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
<RadioCard.ItemIndicator />
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)
}
const items = [
{ value: "next", title: "Next.js" },
{ value: "vite", title: "Vite" },
{ value: "astro", title: "Astro" },
]
使用
import { RadioCard } from "@chakra-ui/react"
<RadioCard.Root>
<RadioCard.Label />
<RadioCard.Item>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<RadioCard.ItemContent>
<RadioCard.ItemText />
<RadioCard.ItemDescription />
</RadioCard.ItemContent>
<RadioCard.ItemIndicator />
</RadioCard.ItemControl>
</RadioCard.Item>
</RadioCard.Root>
信息
如果您更喜欢封闭式组件组合,请查看下方代码片段。示例
描述
这是一个如何为单选卡片添加更多描述的示例。
import { HStack, RadioCard } from "@chakra-ui/react"
const Demo = () => {
return (
<RadioCard.Root defaultValue="next">
<RadioCard.Label>Select framework</RadioCard.Label>
<HStack align="stretch">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<RadioCard.ItemContent>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
<RadioCard.ItemDescription>
{item.description}
</RadioCard.ItemDescription>
</RadioCard.ItemContent>
<RadioCard.ItemIndicator />
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)
}
const items = [
{ value: "next", title: "Next.js", description: "Best for apps" },
{ value: "vite", title: "Vite", description: "Best for SPAs" },
{ value: "astro", title: "Astro", description: "Best for static sites" },
]
尺寸
将 size
属性传递给 RadioCard.Root
组件以更改单选卡片的尺寸。
import { For, HStack, RadioCard, Stack } from "@chakra-ui/react"
const Demo = () => {
return (
<Stack gap="8">
<For each={["sm", "md", "lg"]}>
{(size) => (
<RadioCard.Root key={size} size={size} defaultValue="next">
<RadioCard.Label>size = ({size})</RadioCard.Label>
<HStack align="stretch">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
<RadioCard.ItemIndicator />
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)}
</For>
</Stack>
)
}
const items = [
{ value: "next", title: "Next.js" },
{ value: "vite", title: "Vite" },
]
颜色
将 colorPalette
属性传递给 RadioCard.Root
组件以更改单选卡片的颜色。
import { For, HStack, RadioCard, Stack } from "@chakra-ui/react"
import { colorPalettes } from "compositions/lib/color-palettes"
const Demo = () => {
return (
<Stack gap="8">
<For each={colorPalettes}>
{(colorPalette) => (
<RadioCard.Root
key={colorPalette}
colorPalette={colorPalette}
defaultValue="next"
>
<RadioCard.Label>Select Framework</RadioCard.Label>
<HStack align="stretch">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
<RadioCard.ItemIndicator />
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)}
</For>
</Stack>
)
}
const items = [
{ value: "next", title: "Next.js" },
{ value: "vite", title: "Vite" },
]
变体
将 variant
属性传递给 RadioCard.Root
组件以更改单选卡片的视觉样式。
import { For, HStack, RadioCard, Stack } from "@chakra-ui/react"
const Demo = () => {
return (
<Stack gap="8">
<For each={["surface", "subtle", "outline", "solid"]}>
{(variant) => (
<RadioCard.Root
colorPalette="teal"
key={variant}
variant={variant}
defaultValue="next"
>
<RadioCard.Label>variant = ({variant})</RadioCard.Label>
<HStack align="stretch">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
<RadioCard.ItemIndicator />
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)}
</For>
</Stack>
)
}
const items = [
{ value: "next", title: "Next.js" },
{ value: "vite", title: "Vite" },
]
图标
通过将其放置在 RadioCard.ItemContent
中,可以在单选卡片内渲染自定义图标。
import { HStack, Icon, RadioCard } from "@chakra-ui/react"
import { LuArrowRight, LuCircleOff, LuLock } from "react-icons/lu"
const Demo = () => {
return (
<RadioCard.Root defaultValue="next">
<RadioCard.Label>Select permission</RadioCard.Label>
<HStack align="stretch">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<RadioCard.ItemContent>
<Icon fontSize="2xl" color="fg.muted" mb="2">
{item.icon}
</Icon>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
<RadioCard.ItemDescription>
{item.description}
</RadioCard.ItemDescription>
</RadioCard.ItemContent>
<RadioCard.ItemIndicator />
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)
}
const items = [
{
icon: <LuArrowRight />,
value: "allow",
title: "Allow",
description: "This user can access the system",
},
{
icon: <LuCircleOff />,
value: "deny",
title: "Deny",
description: "This user will be denied access to the system",
},
{
icon: <LuLock />,
value: "lock",
title: "Lock",
description: "This user will be locked out of the system",
},
]
无指示器
这是一个不带指示器的单选卡片示例。
import { HStack, Icon, RadioCard } from "@chakra-ui/react"
import { RiAppleFill, RiBankCardFill, RiPaypalFill } from "react-icons/ri"
const Demo = () => {
return (
<RadioCard.Root
orientation="horizontal"
align="center"
justify="center"
maxW="lg"
defaultValue="paypal"
>
<RadioCard.Label>Payment method</RadioCard.Label>
<HStack align="stretch">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<Icon fontSize="2xl" color="fg.subtle">
{item.icon}
</Icon>
<RadioCard.ItemText ms="-4">{item.title}</RadioCard.ItemText>
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)
}
const items = [
{ value: "paypal", title: "Paypal", icon: <RiPaypalFill /> },
{ value: "apple-pay", title: "Apple Pay", icon: <RiAppleFill /> },
{ value: "card", title: "Card", icon: <RiBankCardFill /> },
]
无指示器(垂直)
这是一个不带指示器且内容垂直对齐的单选卡片示例。
import { HStack, Icon, RadioCard } from "@chakra-ui/react"
import { RiAppleFill, RiBankCardFill, RiPaypalFill } from "react-icons/ri"
const Demo = () => {
return (
<RadioCard.Root
orientation="vertical"
align="center"
maxW="400px"
defaultValue="paypal"
>
<RadioCard.Label>Payment method</RadioCard.Label>
<HStack>
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<Icon fontSize="2xl" color="fg.muted">
{item.icon}
</Icon>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)
}
const items = [
{ value: "paypal", title: "Paypal", icon: <RiPaypalFill /> },
{ value: "apple-pay", title: "Apple Pay", icon: <RiAppleFill /> },
{ value: "card", title: "Card", icon: <RiBankCardFill /> },
]
居中
这是一个文本居中的单选卡片示例。
import { HStack, Icon, RadioCard } from "@chakra-ui/react"
import { LuClock, LuDollarSign, LuTrendingUp } from "react-icons/lu"
const Demo = () => {
return (
<RadioCard.Root orientation="vertical" align="center" defaultValue="next">
<RadioCard.Label>Select contract type</RadioCard.Label>
<HStack align="stretch">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<Icon fontSize="2xl" color="fg.muted" mb="2">
{item.icon}
</Icon>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
<RadioCard.ItemIndicator />
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)
}
const items = [
{ icon: <LuDollarSign />, value: "fixed", title: "Fixed Rate" },
{ icon: <LuTrendingUp />, value: "milestone", title: "Milestone" },
{ icon: <LuClock />, value: "hourly", title: "Hourly" },
]
组合
这是一个将单选卡片与 Group
组件组合的示例。
import { Group, RadioCard } from "@chakra-ui/react"
const Demo = () => {
return (
<RadioCard.Root defaultValue="next" gap="4" maxW="sm">
<RadioCard.Label>How well do you know React?</RadioCard.Label>
<Group attached orientation="vertical">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value} width="full">
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<RadioCard.ItemIndicator />
<RadioCard.ItemContent>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
<RadioCard.ItemDescription>
{item.description}
</RadioCard.ItemDescription>
</RadioCard.ItemContent>
</RadioCard.ItemControl>
</RadioCard.Item>
))}
</Group>
</RadioCard.Root>
)
}
const items = [
{
value: "advanced",
title: "Advanced",
description: "I love complex things",
},
{
value: "professional",
title: "Professional",
description: "I can hack simple things",
},
{
value: "beginner",
title: "Beginner",
description: "I don't write code",
},
]
附加
使用 RadioCard.ItemAddon
组件向单选卡片添加元数据。
import { HStack, RadioCard } from "@chakra-ui/react"
const Demo = () => {
return (
<RadioCard.Root defaultValue="next">
<RadioCard.Label>Select framework</RadioCard.Label>
<HStack align="stretch">
{items.map((item) => (
<RadioCard.Item key={item.value} value={item.value}>
<RadioCard.ItemHiddenInput />
<RadioCard.ItemControl>
<RadioCard.ItemContent>
<RadioCard.ItemText>{item.title}</RadioCard.ItemText>
<RadioCard.ItemDescription>
{item.description}
</RadioCard.ItemDescription>
</RadioCard.ItemContent>
<RadioCard.ItemIndicator />
</RadioCard.ItemControl>
<RadioCard.ItemAddon>Some addon text</RadioCard.ItemAddon>
</RadioCard.Item>
))}
</HStack>
</RadioCard.Root>
)
}
const items = [
{ value: "next", title: "Next.js", description: "Best for apps" },
{ value: "vite", title: "Vite", description: "Best for SPAs" },
{ value: "astro", title: "Astro", description: "Best for static sites" },
]
封闭组件
以下是如何为封闭组件组合设置单选卡片。
import { RadioCard } from "@chakra-ui/react"
import * as React from "react"
interface RadioCardItemProps extends RadioCard.ItemProps {
icon?: React.ReactElement
label?: React.ReactNode
description?: React.ReactNode
addon?: React.ReactNode
indicator?: React.ReactNode | null
indicatorPlacement?: "start" | "end" | "inside"
inputProps?: React.InputHTMLAttributes<HTMLInputElement>
}
export const RadioCardItem = React.forwardRef<
HTMLInputElement,
RadioCardItemProps
>(function RadioCardItem(props, ref) {
const {
inputProps,
label,
description,
addon,
icon,
indicator = <RadioCard.ItemIndicator />,
indicatorPlacement = "end",
...rest
} = props
const hasContent = label || description || icon
const ContentWrapper = indicator ? RadioCard.ItemContent : React.Fragment
return (
<RadioCard.Item {...rest}>
<RadioCard.ItemHiddenInput ref={ref} {...inputProps} />
<RadioCard.ItemControl>
{indicatorPlacement === "start" && indicator}
{hasContent && (
<ContentWrapper>
{icon}
{label && <RadioCard.ItemText>{label}</RadioCard.ItemText>}
{description && (
<RadioCard.ItemDescription>
{description}
</RadioCard.ItemDescription>
)}
{indicatorPlacement === "inside" && indicator}
</ContentWrapper>
)}
{indicatorPlacement === "end" && indicator}
</RadioCard.ItemControl>
{addon && <RadioCard.ItemAddon>{addon}</RadioCard.ItemAddon>}
</RadioCard.Item>
)
})
export const RadioCardRoot = RadioCard.Root
export const RadioCardLabel = RadioCard.Label
export const RadioCardItemIndicator = RadioCard.ItemIndicator
如果您想自动将封闭组件添加到您的项目,请运行此命令
npx @chakra-ui/cli snippet add radio-card
以下是如何使用它
<RadioCardRoot>
<RadioCardLabel />
<RadioCardItem />
</RadioCardRoot>
属性
根组件
属性 | 默认值 | 类型 |
---|---|---|
颜色调色板 | '灰色' | 'gray' | 'red' | 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'cyan' | 'purple' | 'pink' 组件的颜色调色板 |
尺寸 | 'md' | 'sm' | 'md' | 'lg' 组件的尺寸 |
变体 | '轮廓' | 'surface' | 'subtle' | 'outline' | 'solid' 组件的变体 |
对齐 | '开始' | 'start' | 'end' | 'center' 组件的对齐方式 |
方向 | '水平' | 'vertical' | 'horizontal' 组件的方向 |
对齐方式 | 'start' | 'end' | 'center' 组件的对齐方式 | |
as | React.ElementType 要渲染的基础元素。 | |
asChild | ||
无样式 | 布尔值 是否移除组件的样式。 |