Skip to content

Commit daec253

Browse files
author
liyuan-meng
committed
✨分体式表格
1 parent e3633c4 commit daec253

1 file changed

Lines changed: 139 additions & 0 deletions

File tree

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
---
2+
order: 1 title: CTable desc: 默认表格
3+
---
4+
5+
```jsx
6+
/**
7+
* title: 分体式表格
8+
* desc: 单独控制 表格、分页 和 加载 逻辑,使用起来更加灵活。<br/>可以解决表格查询参数通过异步获取,表格需要等待参数获取完再加载,否则查询错误的问题。详见DEMO:<br/>【需求】状态下拉列表是异步获取,交互要求默认展示第一条数据。<br/>【常规写法】为了保证表格只做一次查询并且查询参数是状态列表的第一条数据,如果使用原来的组合式表格,就需要等状态列表返回后再渲染表格,会导致表格区域有短暂的空白(接口慢的话空白时间会更长);<br/>【分体写法】如果使用分体式表格,则不存在这种问题。详细可查看 DEMO 代码
9+
*/
10+
import React, { useState, useEffect } from 'react';
11+
import { CTable, Pagination, Select, Form } from 'cloud-react';
12+
13+
const fetchData = ({ pageNum, pageSize }) => {
14+
return new Promise(resolve => {
15+
setTimeout(() => {
16+
resolve({
17+
data: new Array(pageSize).fill(1).map((item, index) => (
18+
{ id: 121410327 + pageNum + index, name: `手机号优先继续发送${pageNum + index}`, createTime: '2021/12/14 10:19:02', creator: 'liyuan.meng', num: 12222, orderNum: '33,342', status: index % 2 === 0 ? '生效': '失效' }
19+
)),
20+
totals: 30
21+
})
22+
}, 500)
23+
})
24+
}
25+
26+
const fetchStatusList = () => {
27+
return new Promise(resolve => {
28+
setTimeout(() => {
29+
resolve([
30+
{ label: '生效', value: 1 },
31+
{ label: '失效', value: 2 }
32+
])
33+
}, 500)
34+
})
35+
}
36+
37+
const columns = [
38+
{ title: '活动ID', dataIndex: 'id', width: 130 },
39+
{
40+
title: '活动名称', dataIndex: 'name', width: 140, render: val => {
41+
return <CTable.TextTpl value={val} />
42+
}
43+
},
44+
{
45+
title: '创建时间', dataIndex: 'createTime', width: 140, render: val => {
46+
return <CTable.TimeTpl value={val} />
47+
}
48+
},
49+
{
50+
title: '人数',
51+
dataIndex: 'num',
52+
align: 'right',
53+
width: 120,
54+
render: val => <CTable.NumberTpl value={val} precision={0} />
55+
},
56+
{ title: '创建人', dataIndex: 'creator', width: 130 }
57+
];
58+
59+
export default function CTableDemo() {
60+
const [queryParams, setQueryParams] = useState({
61+
status: 1,
62+
pageNum: 1,
63+
pageSize: 10
64+
})
65+
const [loading, setLoading] = useState(false);
66+
const [statusList, setStatusList] = useState([]);
67+
const [ajaxData, setAjaxData] = useState({ data: [], totals: 0 });
68+
69+
useEffect(() => {
70+
// 获取状态下拉列表
71+
fetchStatusList().then(res => {
72+
setStatusList(res);
73+
setQueryParams({
74+
...queryParams,
75+
status: res[0].value
76+
})
77+
})
78+
}, []);
79+
80+
useEffect(() => {
81+
setLoading(true);
82+
if (queryParams.status) {
83+
// 查询参数变化,则更新表格数据
84+
console.log('查询数据', queryParams);
85+
fetchData(queryParams).then(res => {
86+
setAjaxData({
87+
data: res.data,
88+
totals: res.totals
89+
})
90+
}).finally(() => {
91+
setLoading(false);
92+
})
93+
}
94+
}, [JSON.stringify(queryParams)])
95+
96+
const onPageChange = (current, pageSize) => {
97+
setQueryParams({
98+
...queryParams,
99+
pageNum: current,
100+
pageSize,
101+
})
102+
}
103+
104+
return (
105+
<div style={{ display: 'flex', flexDirection: 'column' }}>
106+
<div>
107+
<Form.Item label="状态:">
108+
<Select
109+
value={queryParams.status}
110+
dataSource={statusList}
111+
onChange={v => {
112+
setQueryParams({ status: v });
113+
}}
114+
/>
115+
</Form.Item>
116+
</div>
117+
<CTable
118+
style={{ height: 400 }}
119+
columnData={columns}
120+
ajaxData={ajaxData}
121+
loadingOpts={{
122+
loading,
123+
layer: true
124+
}}
125+
/>
126+
<div style={{ display: 'flex', flexDirection: 'row-reverse', marginTop: 20 }}>
127+
<Pagination
128+
type="simple"
129+
onChange={onPageChange}
130+
total={100}
131+
current={queryParams.pageNum}
132+
pageSize={queryParams.pageSize}
133+
disabled={loading}
134+
/>
135+
</div>
136+
</div>
137+
);
138+
}
139+
```

0 commit comments

Comments
 (0)