Checkbox
Checkbox
사용자가 체크/체크 해제 상태를 토글할 수 있게 해 주는 컨트롤이에요.
출처: 문서
본문
체크박스는 선택 여부를 나타내는 폼 컨트롤이에요. indeterminate(일부 선택) 상태를 지원하고, 키보드 내비게이션을 완전히 지원하며, 제어/비제어 방식 모두 쓸 수 있어요.
Features
- indeterminate(불확정) 상태 지원.
- 완전한 키보드 내비게이션 지원.
- 제어(controlled)/비제어(uncontrolled) 방식 모두 지원.
Anatomy
모든 파트를 임포트해 조립해요.
import { Checkbox } from "radix-ui";
export default () => (
<Checkbox.Root>
<Checkbox.Indicator />
</Checkbox.Root>
);
API Reference
Root
체크박스의 모든 파트를 담아요. form 안에서 사용하면 이벤트 전파가 올바르게 되도록 input도 함께 렌더링돼요.
| Prop | Type | Default |
|---|---|---|
asChild |
boolean |
false |
defaultChecked |
boolean | 'indeterminate' |
No default value |
checked |
boolean | 'indeterminate' |
No default value |
onCheckedChange |
function |
No default value |
disabled |
boolean |
No default value |
required |
boolean |
No default value |
name |
string |
No default value |
value |
string |
on |
| Data attribute | Values |
|---|---|
[data-state] |
"checked" | "unchecked" | "indeterminate" |
[data-disabled] |
Present when disabled |
Indicator
체크박스가 checked 또는 indeterminate 상태일 때 렌더링돼요. 이 요소를 직접 스타일하거나, 아이콘을 넣는 래퍼로 사용하거나, 둘 다 할 수 있어요.
| Prop | Type | Default |
|---|---|---|
asChild |
boolean |
false |
forceMount |
boolean |
No default value |
| Data attribute | Values |
|---|---|
[data-state] |
"checked" | "unchecked" | "indeterminate" |
[data-disabled] |
Present when disabled |
Examples
Indeterminate(불확정)
체크박스의 상태를 직접 제어해서 indeterminate로 설정할 수 있어요.
import { DividerHorizontalIcon, CheckIcon } from "@radix-ui/react-icons";
import { Checkbox } from "radix-ui";
export default () => {
const [checked, setChecked] = React.useState("indeterminate");
return (
<>
<StyledCheckbox checked={checked} onCheckedChange={setChecked}>
<Checkbox.Indicator>
{checked === "indeterminate" && <DividerHorizontalIcon />}
{checked === true && <CheckIcon />}
</Checkbox.Indicator>
</StyledCheckbox>
<button
type="button"
onClick={() =>
setChecked((prevIsChecked) =>
prevIsChecked === "indeterminate" ? false : "indeterminate",
)
}
>
Toggle indeterminate
</button>
</>
);
};
숨겨진 input 분리하기
기본적으로 Checkbox.Root는 폼 제출을 위해 시각적으로 숨겨진 input을 렌더링해요. 그 input을 재구성하거나 이동하거나 제외하려면, 더 낮은 레벨의 파트들로 체크박스를 조립할 수 있어요.
중요: 이 파트들은 불안정하며
unstable_접두사가 붙어 있어서 API가 향후 릴리스에서 바뀔 수 있어요.
Checkbox.unstable_Provider는 체크박스 상태를 제공하고 폼 관련 props(name,value,checked,defaultChecked,required,disabled,onCheckedChange)를 받아요.Checkbox.unstable_Trigger는Checkbox.Indicator를 감싸는 상호작용 버튼이에요.Checkbox.unstable_BubbleInput은Checkbox.Root가 기본으로 렌더링하는 시각적으로 숨겨진 input이에요. 폼 제출이 필요 없으면 생략해요.
import { Checkbox } from "radix-ui";
export default () => (
<Checkbox.unstable_Provider name="terms">
<Checkbox.unstable_Trigger>
<Checkbox.Indicator />
</Checkbox.unstable_Trigger>
<Checkbox.unstable_BubbleInput />
</Checkbox.unstable_Provider>
);
Accessibility
tri-state Checkbox WAI-ARIA 디자인 패턴을 준수해요.
키보드 상호작용
| Key | Description |
|---|---|
Space |
Checks/unchecks the checkbox. |
더 알아보기 (Learn more)
indeterminate상태는 "전체 선택" 같은 부분 선택을 나타낼 때 유용해요.- 내부적으로 폼 제출용 숨김 input을 렌더링하므로
name/valueprops로 폼 값이 전송돼요.