onRow.jsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import React, { useMemo } from 'react';
  2. import { Table, Avatar } from '@douyinfe/semi-ui/';
  3. const DAY = 24 * 60 * 60 * 1000;
  4. const figmaIconUrl = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/figma-icon.png';
  5. function EventTable(props = {}) {
  6. const columns = useMemo(
  7. () => [
  8. {
  9. title: '标题',
  10. dataIndex: 'name',
  11. width: 400,
  12. render: (text, record, index) => {
  13. return (
  14. <div>
  15. <Avatar size="small" shape="square" src={figmaIconUrl} style={{ marginRight: 12 }}></Avatar>
  16. {text}
  17. </div>
  18. );
  19. },
  20. filters: [
  21. {
  22. text: 'Semi Design 设计稿',
  23. value: 'Semi Design 设计稿',
  24. },
  25. {
  26. text: 'Semi Pro 设计稿',
  27. value: 'Semi Pro 设计稿',
  28. },
  29. ],
  30. onFilter: (value, record) => record.name.includes(value),
  31. },
  32. {
  33. title: '大小',
  34. dataIndex: 'size',
  35. sorter: (a, b) => a.size - b.size > 0 ? 1 : -1,
  36. render: (text) => `${text} KB`
  37. },
  38. {
  39. title: '所有者',
  40. dataIndex: 'owner',
  41. render: (text, record, index) => {
  42. return (
  43. <div>
  44. <Avatar size="small" color={record.avatarBg} style={{ marginRight: 4 }}>{typeof text === 'string' && text.slice(0, 1)}</Avatar>
  45. {text}
  46. </div>
  47. );
  48. }
  49. },
  50. {
  51. title: '更新日期',
  52. dataIndex: 'updateTime',
  53. sorter: (a, b) => a.updateTime - b.updateTime > 0 ? 1 : -1,
  54. render: (value) => {
  55. return dateFns.format(new Date(value), 'yyyy-MM-dd');
  56. }
  57. }
  58. ],
  59. []
  60. );
  61. const data = useMemo(() => {
  62. const _data = [];
  63. for (let i = 0; i < 46; i++) {
  64. const isSemiDesign = i % 2 === 0;
  65. const randomNumber = (i * 1000) % 199;
  66. _data.push({
  67. key: '' + i,
  68. name: isSemiDesign ? `Semi Design 设计稿${i}.fig` : `Semi Pro 设计稿${i}.fig`,
  69. owner: isSemiDesign ? '姜鹏志' : '郝宣',
  70. size: randomNumber,
  71. updateTime: new Date().valueOf() + randomNumber * DAY,
  72. avatarBg: isSemiDesign ? 'grey' : 'red'
  73. });
  74. }
  75. return _data;
  76. }, []);
  77. const onRow = useMemo(
  78. () => (record, index) => {
  79. const props = {
  80. className: 'my-tr-class',
  81. };
  82. if (index === 2) {
  83. return {
  84. ...props,
  85. onClick: e => console.log('mouse click: ', record, index),
  86. };
  87. } else {
  88. return {
  89. ...props,
  90. };
  91. }
  92. },
  93. []
  94. );
  95. const onHeaderRow = useMemo(
  96. () => (columns, index) => {
  97. return {
  98. onMouseEnter: e => console.log('mouse enter: ', columns, index),
  99. onMouseLeave: e => console.log('mouse leave: ', columns, index),
  100. };
  101. },
  102. []
  103. );
  104. return <Table columns={columns} dataSource={data} onRow={onRow} onHeaderRow={onHeaderRow} />;
  105. }
  106. render(EventTable);