본문으로 건너뛰기

ZSSegmentedControl

같은 콘텐츠의 하위 보기를 전환하는 세그먼트 컨트롤입니다. 두 플랫폼 모두 zs-ui가 같은 JS 구현으로 그립니다. 스크린 리더 역할만 플랫폼 관례를 따릅니다(접근성).

기본 사용법​

import { ZSSegmentedControl, type ZSSegmentedControlOption } from '@0610studio/zs-ui';

const RANGES: ZSSegmentedControlOption[] = [
{ label: '일', value: 'day' },
{ label: '주', value: 'week' },
{ label: '월', value: 'month' },
];

<ZSSegmentedControl options={RANGES} onValueChange={(value) => setRange(value)} />

Props — ZSSegmentedControlProps<T>​

PropTypeDefault설명
optionsZSSegmentedControlOption<T>[]Required칸 목록. 2~5개, 라벨은 짧은 명사로(HIG·M3)
valueTundefined선택한 value(제어)
defaultValueT첫 항목비제어 초기값
onValueChange(value: T, index: number) => voidundefined고른 칸의 value와 options 안 위치
disabledbooleanfalse컨트롤 전체 비활성 — 칸을 막고 싶을 때
fullWidthbooleantrue부모 폭을 채웁니다. false면 칸 폭을 가장 긴 라벨에 맞춥니다 — 제목 옆처럼 가로 행 안에 둘 때
accessibilityLabelstringundefined컨트롤 이름(무엇을 고르는지, 예: '기간'). 화면에는 보이지 않습니다
styleStyleProp<ViewStyle>undefined
testIDstringundefined

ZSSegmentedControlOption<T>​

필드Type설명
labelstring보이는 문구
valueTonValueChange로 돌려주는 값
accessibilityLabelstring이 칸의 스크린 리더 이름. 기본 label — 기호·줄임말처럼 소리 내어 읽기 어려운 라벨일 때 줍니다

T는 string·number입니다(기본 string). ZSSegmentedControlProps·ZSSegmentedControlOption 타입을 내보냅니다.

제어·비제어​

value를 주지 않으면 비제어이고, 처음 선택은 defaultValue(없으면 첫 항목)입니다.

const VIEWS: ZSSegmentedControlOption[] = [
{ label: '목록', value: 'list' },
{ label: '지도', value: 'map' },
];

const [view, setView] = useState('list');

<ZSSegmentedControl options={VIEWS} value={view} onValueChange={setView} />
{view === 'list' ? <ListView /> : <MapView />}

고른 보기를 페이지처럼 가로로 넘기려면 아래에 ZSSegmentedPages를 둡니다.

칸을 막고 싶을 때​

항목별 비활성 옵션은 없습니다. 고를 수 없는 항목은 options에서 제외합니다.

접근성​

const LAYOUTS: ZSSegmentedControlOption[] = [
{ label: '☰', value: 'list', accessibilityLabel: '목록' },
{ label: '▦', value: 'grid', accessibilityLabel: '격자' },
];

<ZSSegmentedControl options={LAYOUTS} accessibilityLabel="보기" fullWidth={false} />
iOS (VoiceOver)Android (TalkBack)
칸칸마다 버튼 역할, 이름, 선택 상태(시스템 세그먼트처럼)칸마다 라디오 역할, 이름, 선택 상태
컨트롤 이름accessibilityLabel을 칸마다 힌트로 읽습니다(iOS에는 라디오 그룹에 맞는 그릇 역할이 없습니다)accessibilityLabel(라디오 그룹 이름)

컨트롤 이름을 언제 읽는지는 플랫폼마다 다릅니다. 칸 이름만으로 뜻이 통하게 쓰고, 화면에도 옆에 제목을 두는 편이 좋습니다. 힌트 prop은 없습니다.

관련 문서​