183 lines
6.2 KiB
TypeScript
183 lines
6.2 KiB
TypeScript
import React, { useState } from 'react';
|
||
import { Table, Button } from '../../../src';
|
||
import { CodeBlock, ApiTable, ApiRow, sectionStyle, sectionTitleStyle, tagStyle, demoBodyStyle, labelStyle } from '../../tools';
|
||
|
||
const TableDemo: React.FC = () => {
|
||
const [striped, setStriped] = useState(true);
|
||
const [loading, setLoading] = useState(false);
|
||
|
||
const columns = [
|
||
{
|
||
title: '岛民',
|
||
dataIndex: 'name',
|
||
width: 120,
|
||
},
|
||
{
|
||
title: '年龄',
|
||
dataIndex: 'age',
|
||
width: 80,
|
||
align: 'center' as const,
|
||
},
|
||
{
|
||
title: '岛屿',
|
||
dataIndex: 'island',
|
||
},
|
||
{
|
||
title: '喜欢的水果',
|
||
dataIndex: 'fruit',
|
||
},
|
||
{
|
||
title: '爱好',
|
||
dataIndex: 'hobby',
|
||
render: (value: unknown) => {
|
||
const hobby = value as string;
|
||
const tagStyles: Record<string, { bg: string; color: string }> = {
|
||
'音乐': { bg: 'rgba(147, 112, 219, 0.15)', color: '#9370db' },
|
||
'运动': { bg: 'rgba(255, 140, 0, 0.15)', color: '#ff8c00' },
|
||
'唱歌': { bg: 'rgba(255, 99, 71, 0.15)', color: '#ff6347' },
|
||
'钓鱼': { bg: 'rgba(30, 144, 255, 0.15)', color: '#1e90ff' },
|
||
'画画': { bg: 'rgba(255, 105, 180, 0.15)', color: '#ff69b4' },
|
||
};
|
||
const style = tagStyles[hobby] || { bg: 'rgba(25, 200, 185, 0.15)', color: '#19c8b9' };
|
||
return (
|
||
<span style={{
|
||
padding: '4px 12px',
|
||
background: style.bg,
|
||
borderRadius: 20,
|
||
color: style.color,
|
||
fontWeight: 600,
|
||
fontSize: 12,
|
||
}}>
|
||
{hobby}
|
||
</span>
|
||
);
|
||
},
|
||
},
|
||
];
|
||
|
||
const dataSource = [
|
||
{ key: '1', name: '豆狸', age: 26, island: '彩虹岛', fruit: '苹果', hobby: '音乐' },
|
||
{ key: '2', name: '粒狸', age: 24, island: '彩虹岛', fruit: '橘子', hobby: '运动' },
|
||
{ key: '3', name: '西施惠', age: 28, island: '好评岛', fruit: '樱桃', hobby: '唱歌' },
|
||
{ key: '4', name: '喻哥', age: 30, island: '无人岛', fruit: '梨', hobby: '钓鱼' },
|
||
{ key: '5', name: '小润', age: 22, island: '摸鱼岛', fruit: '桃子', hobby: '画画' },
|
||
] as Record<string, unknown>[];
|
||
|
||
const handleLoading = () => {
|
||
setLoading(true);
|
||
setTimeout(() => setLoading(false), 2000);
|
||
};
|
||
|
||
return (
|
||
<div style={sectionStyle}>
|
||
<div style={sectionTitleStyle}>
|
||
Table <span style={tagStyle}>表格</span>
|
||
</div>
|
||
<div style={labelStyle}>
|
||
数据表格组件,支持斑马纹、边框、加载状态等常用功能。
|
||
</div>
|
||
|
||
<div style={{ marginBottom: 16, display: 'flex', gap: 16, flexWrap: 'wrap' }}>
|
||
<Button type={striped ? 'primary' : 'default'} onClick={() => setStriped(!striped)}>
|
||
斑马纹 {striped ? '✓' : '✗'}
|
||
</Button>
|
||
<Button type="primary" onClick={handleLoading} disabled={loading}>
|
||
{loading ? '加载中...' : '模拟加载'}
|
||
</Button>
|
||
</div>
|
||
|
||
<div style={{ ...demoBodyStyle, padding: 0, overflow: 'hidden' }}>
|
||
<Table
|
||
columns={columns}
|
||
dataSource={dataSource}
|
||
striped={striped}
|
||
loading={loading}
|
||
/>
|
||
</div>
|
||
|
||
<CodeBlock
|
||
code={`import React, { useState } from 'react';
|
||
import { Table } from 'animal-island-ui';
|
||
|
||
interface Person {
|
||
key: string;
|
||
name: string;
|
||
age: number;
|
||
island: string;
|
||
fruit: string;
|
||
hobby: string;
|
||
}
|
||
|
||
const columns = [
|
||
{
|
||
title: '岛民',
|
||
dataIndex: 'name',
|
||
width: 120,
|
||
},
|
||
{
|
||
title: '年龄',
|
||
dataIndex: 'age',
|
||
width: 80,
|
||
align: 'center',
|
||
},
|
||
{
|
||
title: '岛屿',
|
||
dataIndex: 'island',
|
||
},
|
||
{
|
||
title: '喜欢的水果',
|
||
dataIndex: 'fruit',
|
||
},
|
||
{
|
||
title: '爱好',
|
||
dataIndex: 'hobby',
|
||
render: (value) => (
|
||
<span style={{
|
||
padding: '4px 12px',
|
||
background: 'rgba(25, 200, 185, 0.15)',
|
||
borderRadius: 20,
|
||
color: '#19c8b9',
|
||
}}>
|
||
{value}
|
||
</span>
|
||
),
|
||
},
|
||
];
|
||
|
||
const data = [
|
||
{ key: '1', name: '豆狸', age: 26, island: '彩虹岛', fruit: '苹果', hobby: '音乐' },
|
||
{ key: '2', name: '粒狸', age: 24, island: '彩虹岛', fruit: '橘子', hobby: '运动' },
|
||
{ key: '3', name: '西施惠', age: 28, island: '好评岛', fruit: '樱桃', hobby: '唱歌' },
|
||
];
|
||
|
||
const App = () => {
|
||
const [striped, setStriped] = useState(true);
|
||
|
||
return (
|
||
<Table
|
||
columns={columns}
|
||
dataSource={data}
|
||
striped={striped}
|
||
/>
|
||
);
|
||
};`}
|
||
/>
|
||
<ApiTable rows={TABLE_API} />
|
||
</div>
|
||
);
|
||
};
|
||
|
||
const TABLE_API: ApiRow[] = [
|
||
{ prop: 'columns', desc: '表格列配置', type: 'TableColumn[]', defaultVal: '[]' },
|
||
{ prop: 'dataSource', desc: '表格数据源', type: 'T[]', defaultVal: '[]' },
|
||
{ prop: 'rowKey', desc: '行唯一标识字段名或函数', type: 'string | (record) => string', defaultVal: 'key' },
|
||
{ prop: 'striped', desc: '是否显示斑马纹', type: 'boolean', defaultVal: 'true' },
|
||
{ prop: 'showHeader', desc: '是否显示表头', type: 'boolean', defaultVal: 'true' },
|
||
{ prop: 'loading', desc: '加载状态', type: 'boolean', defaultVal: 'false' },
|
||
{ prop: 'emptyText', desc: '空数据显示文本', type: 'ReactNode', defaultVal: '暂无数据' },
|
||
{ prop: 'className', desc: '自定义类名', type: 'string', defaultVal: '-' },
|
||
{ prop: 'style', desc: '自定义样式', type: 'CSSProperties', defaultVal: '-' },
|
||
];
|
||
|
||
export default TableDemo;
|