index.jsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { SideSheet, Table, Dropdown, Tag } from '@douyinfe/semi-ui';
  2. import React, { useMemo, useState, useCallback } from 'react';
  3. export default function Demo(props = {}) {
  4. const [visible, setVisible] = useState(false);
  5. const dropdown = useMemo(
  6. () => (
  7. <Dropdown
  8. clickToHide
  9. render={(
  10. <Dropdown.Menu>
  11. <Dropdown.Item onClick={() => setVisible(true)}>Show SideSheet</Dropdown.Item>
  12. </Dropdown.Menu>
  13. )}
  14. >
  15. <Tag>Hover Me</Tag>
  16. </Dropdown>
  17. ),
  18. []
  19. );
  20. const getContainer = useCallback(() => document.querySelector('.sidesheet-container'), []);
  21. const sideSheet = useMemo(
  22. () => (
  23. // eslint-disable-next-line max-len
  24. <SideSheet style={{ zIndex: 2 }} maskStyle={{ zIndex: 2 }} getPopupContainer={getContainer} title="自定义尺寸的侧边栏" visible={visible} onCancel={() => setVisible(false)}>
  25. <p>This is the content of a basic sidesheet.</p>
  26. <p>Here is more content...</p>
  27. </SideSheet>
  28. ),
  29. [visible]
  30. );
  31. const columns = useMemo(() => [
  32. {
  33. title: 'Name',
  34. dataIndex: 'name',
  35. render: text => <a>{text}</a>,
  36. width: 200,
  37. fixed: 'left',
  38. },
  39. {
  40. title: 'Age',
  41. dataIndex: 'age',
  42. },
  43. {
  44. title: 'Address',
  45. dataIndex: 'address',
  46. },
  47. {
  48. render: () => <div>{dropdown}</div>,
  49. width: 200,
  50. fixed: 'right',
  51. },
  52. ]);
  53. const dataTotalSize = 46;
  54. const data = useMemo(() => {
  55. const _data = [];
  56. for (let i = 0; i < dataTotalSize; i++) {
  57. let age = (i * 1000) % 149 ;
  58. let name = `Edward King ${i}`;
  59. _data.push({
  60. key: `${ i}`,
  61. name,
  62. age,
  63. address: `London, Park Lane no. ${i} Lake Park`,
  64. description: `My name is ${name}, I am ${age} years old, living in New York No. ${i + 1} Lake Park.`,
  65. });
  66. }
  67. return _data;
  68. }, [dataTotalSize]);
  69. const scroll = useMemo(() => ({ y: 300 }), []);
  70. return (
  71. <>
  72. <div className="sidesheet-container" style={{ position: 'relative', height: 500 }}>
  73. <Table columns={columns} dataSource={data} scroll={scroll} />
  74. </div>
  75. {sideSheet}
  76. </>
  77. );
  78. }