fixed.jsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import React, { useState, useMemo } from 'react';
  2. import { Table, Avatar } from '@douyinfe/semi-ui';
  3. import { IconMore } from '@douyinfe/semi-icons';
  4. import * as dateFns from 'date-fns';
  5. const DAY = 24 * 60 * 60 * 1000;
  6. const figmaIconUrl = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/figma-icon.png';
  7. const columns = [
  8. {
  9. title: '标题',
  10. dataIndex: 'name',
  11. fixed: true,
  12. width: 250,
  13. render: (text, record, index) => {
  14. return (
  15. <div>
  16. <Avatar size="small" shape="square" src={figmaIconUrl} style={{ marginRight: 12 }}></Avatar>
  17. {text}
  18. </div>
  19. );
  20. },
  21. filters: [
  22. {
  23. text: 'Semi Design 设计稿',
  24. value: 'Semi Design 设计稿',
  25. },
  26. {
  27. text: 'Semi Pro 设计稿',
  28. value: 'Semi Pro 设计稿',
  29. },
  30. ],
  31. onFilter: (value, record) => record.name.includes(value),
  32. },
  33. {
  34. title: '大小',
  35. dataIndex: 'size',
  36. width: 200,
  37. sorter: (a, b) => a.size - b.size > 0 ? 1 : -1,
  38. render: (text) => `${text} KB`
  39. },
  40. {
  41. title: '所有者',
  42. dataIndex: 'owner',
  43. width: 200,
  44. render: (text, record, index) => {
  45. return (
  46. <div>
  47. <Avatar size="small" color={record.avatarBg} style={{ marginRight: 4 }}>{typeof text === 'string' && text.slice(0, 1)}</Avatar>
  48. {text}
  49. </div>
  50. );
  51. }
  52. },
  53. {
  54. title: '更新日期',
  55. dataIndex: 'updateTime',
  56. width: 200,
  57. sorter: (a, b) => a.updateTime - b.updateTime > 0 ? 1 : -1,
  58. render: (value) => {
  59. return dateFns.format(new Date(value), 'yyyy-MM-dd');
  60. }
  61. },
  62. {
  63. title: '',
  64. dataIndex: 'operate',
  65. fixed: 'right',
  66. align: 'center',
  67. width: 100,
  68. render: () => {
  69. return <IconMore />;
  70. }
  71. },
  72. ];
  73. function App() {
  74. const [dataSource, setData] = useState([]);
  75. const scroll = useMemo(() => ({ y: 300, x: 1200 }), []);
  76. const rowSelection = useMemo(() => ({
  77. onChange: (selectedRowKeys, selectedRows) => {
  78. console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
  79. },
  80. getCheckboxProps: record => ({
  81. disabled: record.name === 'Michael James', // Column configuration not to be checked
  82. name: record.name,
  83. }),
  84. fixed: true,
  85. }), []);
  86. const getData = () => {
  87. const data = [];
  88. for (let i = 0; i < 46; i++) {
  89. const isSemiDesign = i % 2 === 0;
  90. const randomNumber = (i * 1000) % 199;
  91. data.push({
  92. key: '' + i,
  93. name: isSemiDesign ? `Semi Design 设计稿${i}.fig` : `Semi Pro 设计稿${i}.fig`,
  94. owner: isSemiDesign ? '姜鹏志' : '郝宣',
  95. size: randomNumber,
  96. updateTime: new Date().valueOf() + randomNumber * DAY,
  97. avatarBg: isSemiDesign ? 'grey' : 'red'
  98. });
  99. }
  100. return data;
  101. };
  102. useEffect(() => {
  103. const data = getData();
  104. setData(data);
  105. }, []);
  106. return <Table columns={columns} dataSource={dataSource} rowSelection={rowSelection} scroll={scroll} />;
  107. }
  108. render(App);