Checkbox
Checkbox 从 HeroUI v2 到 v3 的迁移指南。
完整的 API 参考、样式指南与高级示例请参阅 v3 Checkbox 文档。本指南只关注从 HeroUI v2 的迁移。
结构变化
在 v2 中,Checkbox 将 children 作为标签文本:
import { Checkbox } from "@lenso/ui";
export default function App() { return <Checkbox defaultSelected>Option</Checkbox>;}在 v3 中,Checkbox 采用复合组件模式,并使用显式子组件:
import { Checkbox, Label } from "@lenso/ui";
export default function App() { return ( <Checkbox defaultSelected id="option"> <Checkbox.Content> <Checkbox.Control> <Checkbox.Indicator /> </Checkbox.Control> Option </Checkbox.Content> </Checkbox> );}主要变化
1. 组件结构
v2: 简单组件,children 即标签
v3: 复合组件:Checkbox.Content、Checkbox.Control、Checkbox.Indicator
2. 标签处理
v2: 标签直接作为 children 传入 Checkbox
v3: 标签放在 Checkbox.Content(可点击的标签)内;Description / FieldError 是 Checkbox.Content 的同级节点
3. Prop 变更
| v2 prop | v3 位置 | 说明 |
|---|---|---|
onValueChange | Checkbox | 请使用 onChange |
color | — | 已移除(请在 Checkbox.Control 上使用 Tailwind) |
size | — | 已移除(请使用 Tailwind,例如 size-4、size-5) |
radius | — | 已移除(请使用 Tailwind,例如 rounded-sm) |
lineThrough | — | 已移除(请在标签上使用 Tailwind line-through) |
icon | — | 请在 Checkbox.Indicator 内使用自定义内容 |
classNames | — | 请在各部分上使用 className |
disableAnimation | — | 已移除 |
| — | variant | 新增 prop:"primary"(默认)或 "secondary",用于较低强调度的样式 |
4. CheckboxGroup 变化
v2: CheckboxGroup(独立组件)使用 label prop,子节点为简单的 Checkbox
v3: CheckboxGroup(独立组件)将 Label / Description 作为子节点,且每个 Checkbox 使用复合结构
迁移 CheckboxGroup 时请参阅 CheckboxGroup 迁移指南。
迁移示例
受控 Checkbox
import { useState } from "react";
const [isSelected, setIsSelected] = useState(false);
<Checkbox isSelected={isSelected} onValueChange={setIsSelected}> Subscribe</Checkbox>含描述的 Checkbox
{/* v2 无内置描述 */}<Checkbox defaultSelected> Option</Checkbox><p className="text-sm text-default-500">Description text</p>CheckboxGroup
import { Checkbox, CheckboxGroup } from "@lenso/ui";
<CheckboxGroup label="Select cities"> <Checkbox value="buenos-aires">Buenos Aires</Checkbox> <Checkbox value="sydney">Sydney</Checkbox> <Checkbox value="san-francisco">San Francisco</Checkbox></CheckboxGroup>颜色与尺寸
{/* Colors */}<Checkbox defaultSelected color="primary">Primary</Checkbox>
{/* Sizes */}<Checkbox defaultSelected size="md">Medium</Checkbox>自定义图标 / 指示器
<Checkbox defaultSelected icon={<HeartIcon />}> Option</Checkbox>变体
v3 引入 variant prop,可选 "primary"(默认)与 "secondary":
{/* Primary variant (default) */}<Checkbox variant="primary" id="primary-option"> <Checkbox.Content> <Checkbox.Control> <Checkbox.Indicator /> </Checkbox.Control> Primary </Checkbox.Content></Checkbox>
{/* Secondary variant - lower emphasis, suitable for Surface components */}<Checkbox variant="secondary" id="secondary-option"> <Checkbox.Content> <Checkbox.Control> <Checkbox.Indicator /> </Checkbox.Control> Secondary </Checkbox.Content></Checkbox>半选(indeterminate)状态
<Checkbox isIndeterminate>Option</Checkbox>渲染 prop 模式
v3 Checkbox 支持渲染 prop,用于暴露状态信息:
<Checkbox id="terms"> {({isSelected, isIndeterminate, isHovered, isPressed, isFocused, isDisabled}) => ( <> <Checkbox.Content> <Checkbox.Control> <Checkbox.Indicator /> </Checkbox.Control> {isSelected ? "Terms accepted" : "Accept terms"} </Checkbox.Content> </> )}</Checkbox>Checkbox.Indicator 也支持渲染 prop,并提供相同的状态字段。便于根据 Checkbox 状态渲染自定义指示器:
<Checkbox id="custom"> <Checkbox.Content> <Checkbox.Control> <Checkbox.Indicator> {({isSelected, isIndeterminate}) => isIndeterminate ? <MinusIcon /> : isSelected ? <CheckIcon /> : null } </Checkbox.Indicator> </Checkbox.Control> Custom indicator </Checkbox.Content></Checkbox>可用的渲染 prop 字段:
isSelected:是否选中isIndeterminate:是否为半选状态isHovered:是否悬停isPressed:是否处于按下中isFocused:是否聚焦isFocusVisible:是否应显示焦点环isDisabled:是否禁用isReadOnly:是否只读
样式变化
v2:classNames prop
<Checkbox classNames={{ base: "custom-base", wrapper: "custom-wrapper", icon: "custom-icon", label: "custom-label" }}/>v3:直接使用 className
<Checkbox className="custom-base" id="option"> <Checkbox.Content> <Checkbox.Control className="custom-control"> <Checkbox.Indicator className="custom-indicator" /> </Checkbox.Control> Option </Checkbox.Content></Checkbox>组件剖析
v3 Checkbox 的结构如下:
Checkbox (Root) ├── Checkbox.Content (the clickable label) │ ├── Checkbox.Control │ │ └── Checkbox.Indicator │ └── Label ├── Description (optional, sibling) └── FieldError (optional, sibling)总结
- 组件结构:必须使用复合组件(
Button、Control、Indicator)。 - 标签处理:标签放在
Checkbox.Content内。 onValueChange→onChange:事件处理函数 prop 已重命名。- 颜色已移除:请在
Checkbox.Control上使用 Tailwind CSS 类。 - 尺寸已移除:请在
Checkbox.Control上使用 Tailwind CSS 类。 - 圆角已移除:请在
Checkbox.Control上使用 Tailwind CSS 类。 lineThrough已移除:请在标签上使用 Tailwindline-through类。iconprop 已移除:请在Checkbox.Indicator内使用自定义内容。- CheckboxGroup:组件名不变;子节点使用
Label/Description,且Checkbox使用复合结构。 classNames已移除:请在各子组件上使用className。- 新增
variantprop:支持"primary"(默认)与"secondary",用于较低强调度样式。 - 指示器渲染 prop:
Checkbox.Indicator可传入渲染函数,参数包含isSelected、isIndeterminate等状态。