# Segmented Control
URL: /lynx/components/segmented-control
Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/segmented-control.mdx
여러 옵션 중 하나를 선택하여 관련 콘텐츠를 즉시 필터링하거나 전환할 때 사용하는 컴포넌트입니다.
Lynx Engine 최소 버전: 3.6
사용 가능 버전: @seed-design/lynx-react@0.6.0, @seed-design/lynx-css@0.10.0
## Preview
```tsx
import "./styles";
import { root } from "@lynx-js/react";
import { useSeedClassName } from "@seed-design/lynx-react";
import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
인기순
최신순
);
}
root.render();
```
## Installation
- npm: npx @seed-design/cli add ui:segmented-control
- pnpm: pnpm dlx @seed-design/cli add ui:segmented-control
- yarn: yarn dlx @seed-design/cli add ui:segmented-control
- bun: bun x @seed-design/cli add ui:segmented-control
## Props
### `SegmentedControl`
`value`와 `defaultValue` 중 하나를 제공해야 선택된 항목과 Indicator를 표시할 수 있습니다.
### `SegmentedControlItem`
## Usage
```tsx
import {
SegmentedControl,
SegmentedControlItem,
} from "@/components/ui/segmented-control";
export function App() {
return (
인기순
최신순
);
}
```
Registry의 `SegmentedControl`은 선택 Indicator를 자동으로 추가합니다.
## Examples
### Disabled
`SegmentedControl`의 `disabled`는 전체 항목을 비활성화합니다. 각 `SegmentedControlItem`도 따로 비활성화할 수 있습니다.
```tsx
import "./styles";
import { root } from "@lynx-js/react";
import { useSeedClassName } from "@seed-design/lynx-react";
import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
인기순
최신순
인기순
최신순
);
}
root.render();
```
### Long Label
```tsx
import "./styles";
import { root } from "@lynx-js/react";
import { useSeedClassName } from "@seed-design/lynx-react";
import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
가격 높은 순
할인율 높은 순
인기 많은 순
);
}
root.render();
```
### Fixed Width
`SegmentedControl`의 `style`이나 `className`으로 너비를 지정할 수 있습니다.
```tsx
import "./styles";
import { root } from "@lynx-js/react";
import { useSeedClassName } from "@seed-design/lynx-react";
import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
One Way Trip
Round Trip
Multi-City Journey
);
}
root.render();
```
### Listening to Value Changes
`onValueChange`로 선택 값 변경을 감지할 수 있습니다. Controlled 모드에서는 `value`와 함께 사용합니다.
```tsx
import "./styles";
import { root, useState } from "@lynx-js/react";
import { useSeedClassName } from "@seed-design/lynx-react";
import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
const [value, setValue] = useState("hot");
function handleValueChange(nextValue: string) {
"background only";
setValue(nextValue);
}
return (
인기순
최신순
선택값: {value}
);
}
root.render();
```
## 웹 버전과의 차이
| 항목 | React Web | Lynx |
| --------- | -------------------------- | ------------------------------------- |
| 렌더링 요소 | HTML `label`, `input` | 네이티브 `view`, `text` |
| 선택 이벤트 | input change | `bindtap`, 공개 상태 이벤트는 `onValueChange` |
| 접근성 | ARIA `radiogroup`, `radio` | Lynx `accessibility-*` 속성 |
| Indicator | CSS grid와 custom property | Grid layout과 custom property |
## Lynx 미지원 기능
- HTML form 제출을 위한 `ItemHiddenInput`, `name`, `form`, `inputProps`
- 키보드 focus와 focus-visible 상호작용
- Registry `SegmentedControlItem`의 `notification` prop
Lynx에는 대응하는 Notification Badge 컴포넌트가 없어 `notification` prop을 제공하지 않습니다. 항목 레이블은 문자열이나 숫자로 전달합니다.