AngleSlider
AngleSlider
0에서 360 사이의 각도 값을 고르는 컴포넌트예요. 방사형 슬라이더 형태로 각도를 선택할 때 사용해요.
출처: 문서
본문
Usage
AngleSlider 컴포넌트로 0에서 360 사이의 각도 값을 고를 수 있어요.
import { AngleSlider } from '@mantine/core';
function Demo() {
return <AngleSlider formatLabel={(value) => `${value}°`} />;
}
Controlled
AngleSlider 값은 0에서 360 사이의 숫자예요.
import { useState } from 'react';
import { AngleSlider } from '@mantine/core';
function Demo() {
const [value, setValue] = useState(180);
return <AngleSlider value={value} onChange={setValue} />;
}
AngleSlider with uncontrolled forms
AngleSlider는 비제어 폼(uncontrolled forms)과 함께 사용할 수 있어요. name 속성을 설정하면 폼 제출 시 슬라이더 값을 FormData 객체에 포함시킬 수 있어요. 비제어 폼에서 초기 값을 제어하려면 defaultValue prop을 사용하세요.
비제어 폼에서 사용하는 props:
name– hidden input에 전달되는 name 속성hiddenInputProps– hidden input에 전달되는 추가 props
FormData와 함께 비제어 AngleSlider를 사용하는 예시:
import { AngleSlider } from '@mantine/core';
export function WithFormData() {
return (
<form
onSubmit={(event) => {
event.preventDefault();
const formData = new FormData(event.currentTarget);
console.log('Checkbox group value:', formData.get('angle'));
}}
>
<AngleSlider name="angle" />
<button type="submit">Submit</button>
</form>
);
}
formatLabel
formatLabel prop으로 각도 라벨 형식을 바꿀 수 있어요. 각도 값을 받아 React 노드를 반환하는 함수를 받아요.
import { AngleSlider } from '@mantine/core';
function Demo() {
return <AngleSlider formatLabel={(value) => `${value}°`} />;
}
Marks
marks prop으로 슬라이더에 표시점(marks)을 표시할 수 있어요. 마크는 값(필수, 0~360 사이 숫자)과 라벨(선택, React 노드)을 가진 객체예요. 선택을 마크로만 제한하려면 restrictToMarks prop을 설정하세요.
import { AngleSlider, Group } from '@mantine/core';
function Demo() {
return (
<Group>
<AngleSlider
formatLabel={(value) => `${value}°`}
size={100}
restrictToMarks
marks={[
{ value: 0 },
{ value: 45 },
{ value: 90 },
{ value: 135 },
{ value: 180 },
{ value: 225 },
{ value: 270 },
{ value: 315 },
]}
/>
<AngleSlider
formatLabel={(value) => `${value}°`}
size={100}
marks={[
{ value: 0, label: '0°' },
{ value: 45, label: '45°' },
{ value: 90, label: '90°' },
{ value: 135, label: '135°' },
{ value: 180, label: '180°' },
{ value: 225, label: '225°' },
{ value: 270, label: '270°' },
{ value: 315, label: '315°' },
]}
/>
</Group>
);
}
onChangeEnd
onChangeEnd 콜백은 사용자가 슬라이더 드래그를 멈추거나 키보드로 값을 바꿀 때 발생해요. 디바운스된 콜백으로 사용해 잦은 업데이트를 방지할 수 있어요.
import { useState } from 'react';
import { AngleSlider, Text } from '@mantine/core';
function Demo() {
const [value, setValue] = useState(0);
const [endValue, setEndValue] = useState(0);
return (
<>
<AngleSlider value={value} onChange={setValue} onChangeEnd={setEndValue} />
<Text>Current value: {value}</Text>
<Text>End value: {endValue}</Text>
</>
);
}
disabled
disabled prop은 컴포넌트를 비활성화하고 사용자 상호작용을 막아요.
Accessibility
컴포넌트를 스크린 리더가 접근할 수 있게 하려면 aria-label prop을 설정하세요.
import { AngleSlider } from '@mantine/core';
function Demo() {
return <AngleSlider aria-label="Rotation angle" />;
}
컴포넌트가 포커스됐을 때의 키보드 상호작용:
| Key | Description |
|---|---|
| ArrowDown | 값을 step만큼 감소 |
| ArrowLeft | 값을 step만큼 감소 |
| ArrowUp | 값을 step만큼 증가 |
| ArrowRight | 값을 step만큼 증가 |
| Home | 값을 0으로 설정 |
| End | 값을 359로 설정 |
Based on use-radial-move
AngleSlider는 use-radial-move 훅을 기반으로 해요. 컴포넌트 동작을 더 세밀하게 제어해야 한다면 이 훅으로 커스텀 방사형 슬라이더를 만들 수 있어요.
import { useState } from 'react';
import { Box } from '@mantine/core';
import { useRadialMove } from '@mantine/hooks';
import classes from './Demo.module.css';
function Demo() {
const [value, setValue] = useState(115);
const { ref } = useRadialMove(setValue);
return (
<Box ref={ref} className={classes.root} data-value={value}>
{value}°
</Box>
);
}