Loader
Loader
로딩 상태를 표시하는 컴포넌트예요. Loader 컴포넌트는 기본적으로 oval, bars, dots 세 가지 로더 유형을 지원하며, 모든 로더는 성능을 위해 CSS로 애니메이션 처리돼요.
출처: 문서
본문
사용법 (Usage)
Loader 컴포넌트는 기본적으로 oval, bars, dots 세 가지 유형의 로더를 지원해요. 모든 로더는 더 나은 성능을 위해 CSS로 애니메이션 처리돼요.
import { Loader } from '@mantine/core';
function Demo() {
return <Loader />;
}
color와 size prop으로 색상과 크기를 조절할 수 있어요.
size prop
size prop에는 유효한 CSS 값이나 숫자를 전달할 수 있어요. 숫자는 px로 취급되지만 rem으로 변환돼요. 예를 들어 size={32}는 --loader-size: 2rem CSS 변수를 만들어 내요.
import { Loader } from '@mantine/core';
function Demo() {
return <Loader size={32} />;
}
사용자 정의 로더 추가하기 (Adding custom loaders)
Loader 컴포넌트는 다른 컴포넌트(Button, ActionIcon, LoadingOverlay 등)에서도 사용돼요. default props로 type을 설정해 로더 유형을 바꿀 수 있고, loaders default prop으로 커스텀 CSS나 SVG 로더를 추가할 수도 있어요.
CSS 전용 로더 (Custom CSS only loader)
size와 color prop이 커스텀 로더에서 동작하려면 로더 스타일에 --loader-size와 --loader-color CSS 변수를 사용해야 해요.
import { MantineProvider, Loader } from '@mantine/core';
import { CssLoader } from './CssLoader';
const theme = createTheme({
components: {
Loader: Loader.extend({
defaultProps: {
loaders: { ...Loader.defaultLoaders, custom: CssLoader },
type: 'custom',
},
}),
},
});
커스텀 SVG 로더 (Custom SVG loader)
SVG 기반 애니메이션은 다음 문제가 있을 수 있으므로 CSS 전용 로더를 권장해요.
- CPU 사용량이 높아 저사양 기기에서는 로더가 끊겨 보일 수 있어요
- JS가 로드될 때까지 애니메이션이 시작되지 않아 정적 로더가 보일 수 있어요
SVG 로더에서도 size와 color prop이 동작하도록 CSS 전용 로더와 같은 방식으로 --loader-size와 --loader-color 변수를 사용해야 해요. 보통 width와 height를 var(--loader-size)로, fill/stroke를 var(--loader-color)로 설정하면 돼요.
children prop
Loader는 children prop을 지원해요. children에 값을 전달하면 로더 대신 그 값이 렌더링돼요. 이는 loaderProps를 사용하는 컴포넌트(예: Button, LoadingOverlay, Dropzone)에서 Loader의 표현을 제어하고자 할 때 유용해요.
import { useDisclosure } from '@mantine/hooks';
import { LoadingOverlay, Button, Group, Box } from '@mantine/core';
function Demo() {
const [visible, { toggle }] = useDisclosure(false);
return (
<>
<Box pos="relative">
<LoadingOverlay visible={visible} loaderProps={{ children: 'Loading...' }} />
{/* ...other content */}
</Box>
<Group justify="center">
<Button onClick={toggle}>Toggle overlay</Button>
</Group>
</>
);
}