통계
통계 (Statistic)
중요한 데이터나 통계 수치를 강조해서 보여주고 싶을 때 사용하는 컴포넌트입니다. 부제와 단위를 함께 붙일 수 있어요.
출처: 문서
본문
언제 사용하나요 (When To Use)
- 특정 데이터를 강조하고 싶을 때
- 설명과 함께 통계 데이터를 표시하고 싶을 때
예제 (Examples)
기본 (Basic)
가장 간단한 사용법입니다.
import React from 'react';
import { Button, Col, Row, Statistic } from 'antd';
const App: React.FC = () => (
<Row gutter={16}>
<Col span={12}>
<Statistic title="Active Users" value={112893} />
</Col>
<Col span={12}>
<Statistic title="Account Balance (CNY)" value={112893} precision={2} />
<Button style={{ marginTop: 16 }} type="primary">
Recharge
</Button>
</Col>
<Col span={12}>
<Statistic title="Active Users" value={112893} loading />
</Col>
</Row>
);
export default App;
단위 (Unit)
prefix와 suffix를 통해 단위를 추가합니다.
import React from 'react';
import { LikeOutlined } from '@ant-design/icons';
import { Col, Row, Statistic } from 'antd';
const App: React.FC = () => (
<Row gutter={16}>
<Col span={12}>
<Statistic title="Feedback" value={1128} prefix={<LikeOutlined />} />
</Col>
<Col span={12}>
<Statistic title="Unmerged" value={93} suffix="/ 100" />
</Col>
</Row>
);
export default App;
애니메이션 숫자 (Animated number)
react-countup으로 애니메이션 숫자를 만듭니다.
import React from 'react';
import type { StatisticProps } from 'antd';
import { Col, Row, Statistic } from 'antd';
import { createStyles } from 'antd-style';
import CountUp from 'react-countup';
const useStyle = createStyles(({ css }) => {
return {
content: css`
font-variant-numeric: tabular-nums;
`,
};
});
const formatter: StatisticProps['formatter'] = (value) => (
<CountUp end={value as number} separator="," />
);
const Demo: React.FC = () => {
const { styles } = useStyle();
return (
<Row gutter={16}>
<Col span={12}>
<Statistic
classNames={{ content: styles.content }}
title="Active Users"
value={112893}
formatter={formatter}
/>
</Col>
<Col span={12}>
<Statistic
classNames={{ content: styles.content }}
title="Account Balance (CNY)"
value={112893}
precision={2}
formatter={formatter}
/>
</Col>
</Row>
);
};
export default Demo;
Card 안에서 (In Card)
Card 안에 통계 데이터를 표시합니다.
import React from 'react';
import { ArrowDownOutlined, ArrowUpOutlined } from '@ant-design/icons';
import { Card, Col, Row, Statistic } from 'antd';
const App: React.FC = () => (
<Row gutter={16}>
<Col span={12}>
<Card variant="borderless">
<Statistic
title="Active"
value={11.28}
precision={2}
styles={{ content: { color: '#3f8600' } }}
prefix={<ArrowUpOutlined />}
suffix="%"
/>
</Card>
</Col>
<Col span={12}>
<Card variant="borderless">
<Statistic
title="Idle"
value={9.3}
precision={2}
styles={{ content: { color: '#cf1322' } }}
prefix={<ArrowDownOutlined />}
suffix="%"
/>
</Card>
</Col>
</Row>
);
export default App;
타이머 (Timer)
타이머 컴포넌트입니다.
import React from 'react';
import type { StatisticTimerProps } from 'antd';
import { Col, Row, Statistic } from 'antd';
import { createStyles } from 'antd-style';
const { Timer } = Statistic;
const useStyle = createStyles(({ css }) => {
return {
content: css`
font-variant-numeric: tabular-nums;
`,
};
});
const deadline = Date.now() + 1000 * 60 * 60 * 24 * 2 + 1000 * 30; // Dayjs is also OK
const before = Date.now() - 1000 * 60 * 60 * 24 * 2 + 1000 * 30;
const tenSecondsLater = Date.now() + 10 * 1000;
const onFinish: StatisticTimerProps['onFinish'] = () => {
console.log('finished!');
};
const onChange: StatisticTimerProps['onChange'] = (val) => {
if (typeof val === 'number' && !Number.isNaN(val) && 4.95 * 1000 < val && val < 5 * 1000) {
console.log('changed!');
}
};
const Demo: React.FC = () => {
const { styles } = useStyle();
return (
<Row gutter={16}>
<Col span={12}>
<Timer
classNames={{ content: styles.content }}
type="countdown"
value={deadline}
onFinish={onFinish}
/>
</Col>
<Col span={12}>
<Timer
classNames={{ content: styles.content }}
type="countdown"
title="Milliseconds"
value={deadline}
format="HH:mm:ss:SSS"
/>
</Col>
<Col span={12}>
<Timer
classNames={{ content: styles.content }}
type="countdown"
title="Countdown"
value={tenSecondsLater}
onChange={onChange}
/>
</Col>
<Col span={12}>
<Timer
classNames={{ content: styles.content }}
type="countup"
title="Countup"
value={before}
onChange={onChange}
/>
</Col>
<Col span={24} style={{ marginTop: 32 }}>
<Timer
classNames={{ content: styles.content }}
type="countdown"
title="Day Level (Countdown)"
value={deadline}
format="D 天 H 时 m 分 s 秒"
/>
</Col>
<Col span={24} style={{ marginTop: 32 }}>
<Timer
classNames={{ content: styles.content }}
type="countup"
title="Day Level (Countup)"
value={before}
format="D 天 H 时 m 分 s 秒"
/>
</Col>
</Row>
);
};
export default Demo;
커스텀 시맨틱 DOM 스타일링 (Custom semantic dom styling)
classNames와 styles에 객체 또는 함수를 넘겨서 Statistic의 시맨틱 DOM 스타일을 커스터마이즈할 수 있습니다.
import React from 'react';
import { ArrowUpOutlined } from '@ant-design/icons';
import { Flex, Statistic } from 'antd';
import type { GetProp, StatisticProps } from 'antd';
import { createStaticStyles } from 'antd-style';
const classNames = createStaticStyles(({ css }) => ({
root: css`
border: 2px dashed #ccc;
padding: 16px;
border-radius: 8px;
`,
}));
const styleFn: StatisticProps['styles'] = ({
props,
}): GetProp<StatisticProps, 'styles', 'Return'> => {
const numValue = Number(props.value ?? 0);
const isNegative = Number.isFinite(numValue) && numValue < 0;
if (isNegative) {
return {
title: {
color: '#ff4d4f',
},
content: {
color: '#ff7875',
},
value: {
backgroundColor: '#fff1f0',
borderRadius: 4,
paddingInline: 6,
userSelect: 'none',
},
};
}
return {};
};
const Demo: React.FC = () => {
const statisticSharedProps: StatisticProps = {
classNames: { root: classNames.root },
prefix: <ArrowUpOutlined />,
};
return (
<Flex vertical gap="medium">
<Statistic
{...statisticSharedProps}
title="Monthly Active Users"
value={93241}
styles={{
title: { color: '#1890ff', fontWeight: 600 },
content: { fontSize: '24px' },
value: {
backgroundColor: '#e6f4ff',
borderRadius: 4,
color: '#0958d9',
paddingInline: 6,
userSelect: 'none',
},
}}
suffix="users"
/>
<Statistic
{...statisticSharedProps}
title="Yearly Loss"
value={-18.7}
precision={1}
styles={styleFn}
suffix="%"
/>
</Flex>
);
};
export default Demo;
API
Common props ref:Common props
Statistic
| Property | Description | Type | Default | Version | Global Config |
|---|---|---|---|---|---|
| classNames | Customize class for each semantic structure inside the Statistic component. Supports object or function. | Record<SemanticDOM, string> | (info: { props }) => Record<SemanticDOM, string> | - | 6.0.0 | |
| decimalSeparator | The decimal separator | string | . |
× | |
| formatter | Customize value display logic | (value) => ReactNode | - | × | |
| groupSeparator | Group separator | string | , |
× | |
| loading | Loading status of Statistic | boolean | false | 4.8.0 | × |
| precision | The precision of input value | number | - | × | |
| prefix | The prefix node of value | ReactNode | - | × | |
| styles | Customize inline style for each semantic structure inside the Statistic component. Supports object or function. | Record<SemanticDOM, CSSProperties> | (info: { props }) => Record<SemanticDOM, CSSProperties> | - | 6.0.0 | |
| suffix | The suffix node of value | ReactNode | - | × | |
| title | Display title | ReactNode | - | × | |
| value | Display value | string | number | - | × | |
Set value section style, please use styles.content instead |
CSSProperties | - | × |
Statistic.Countdown Deprecated
| Property | Description | Type | Default | Version |
|---|---|---|---|---|
| format | Format as dayjs | string | HH:mm:ss |
|
| prefix | The prefix node of value | ReactNode | - | |
| suffix | The suffix node of value | ReactNode | - | |
| title | Display title | ReactNode | - | |
| value | Set target countdown time | number | - | |
| valueStyle | Set value section style | CSSProperties | - | |
| onFinish | Trigger when time's up | () => void | - | |
| onChange | Trigger when time's changing | (value: number) => void | - | - |
Statistic.Timer 5.25.0+
| Property | Description | Type | Default | Version |
|---|---|---|---|---|
| type | Timer direction, count down or count up | countdown | countup |
- | |
| format | Format as dayjs | string | HH:mm:ss |
|
| prefix | The prefix node of value | ReactNode | - | |
| suffix | The suffix node of value | ReactNode | - | |
| title | Display title | ReactNode | - | |
| value | Target time for countdown, or start time for countup (timestamp in ms) |
number | - | |
| valueStyle | Set value section style | CSSProperties | - | |
| onFinish | Trigger when time's up, only called when type is countdown |
() => void | - | |
| onChange | Trigger when time's changing | (value: number) => void | - |
시맨틱 DOM (Semantic DOM)
Statistic은 root, header, title, content, value, prefix, suffix 시맨틱 DOM 노드를 지원합니다.
https://ant.design/components/statistic/semantic.md
디자인 토큰 (Design Token)
컴포넌트 토큰 (Component Token - Statistic)
| Token Name | Description | Type | Default Value |
|---|---|---|---|
| contentFontSize | Content font size | string | number | 24 |
| titleFontSize | Title font size | number | 14 |
글로벌 토큰 (Global Token)
| Token Name | Description | Type | Default Value |
|---|---|---|---|
| colorText | Default text color which comply with W3C standards, and this color is also the darkest neutral color. | string | |
| colorTextDescription | Control the font color of text description. | string | |
| colorTextHeading | Control the font color of heading. | string | |
| fontFamily | The font family of Ant Design prioritizes the default interface font of the system, and provides a set of alternative font libraries that are suitable for screen display to maintain the readability and readability of the font under different platforms and browsers, reflecting the friendly, stable and professional characteristics. | string | |
| fontSize | The most widely used font size in the design system, from which the text gradient will be derived. | number | |
| lineHeight | Line height of text. | number | |
| marginXXS | Control the margin of an element, with the smallest size. | number | |
| padding | Control the padding of the element. | number |