StickyTable功能点

  1. 支持横向,纵向虚拟滚动
  2. 列拖拽
  3. Sticky吸顶

loading加载中的状态
image.png

暂无数据
image.png

StickyTable

css variables 不能用 rgba 设置颜色,
因为左侧固定的列,拖拽时,rgba半透明,会透出下面的文字

  1. import {useState} from 'react';
  2. import { array, bool } from 'prop-types';
  3. import { BaseTable, useTablePipeline, features } from 'ali-react-table';
  4. import { Spin, Empty } from 'antd';
  5. import styles from './style.module.less';
  6. function BlockSpin() {
  7. return <Spin style={{ display: 'block' }} />;
  8. }
  9. const style = {
  10. maxHeight: '640px',
  11. overflow: 'auto',
  12. '--line-height': 1.5715,
  13. '--font-size': '12px',
  14. '--row-height': '48px',
  15. '--header-row-height': '40px',
  16. '--cell-padding': '8px',
  17. '--lock-shadow': '10px 0 8px -8px rgba(0, 0, 0, 0.2)',
  18. '--border-color': '#f0f0f0',
  19. // '--bgcolor': '#fff',
  20. '--bgcolor': 'inherit', // transparent 用 tr的颜色,选中当前行
  21. '--header-bgcolor': '#dceefe', // 'rgba(205,229,253, 0.45)',
  22. '--color': 'rgba(0, 0, 0, 0.65)', // td文字颜色
  23. '--header-color': 'rgba(0, 0, 0, 0.65)', // th 文字颜色
  24. // '--hover-bgcolor': '#fafafa',
  25. '--hover-bgcolor': '#fafcff', // 'rgba(205,229,253, 0.1)', // hover时 tr的颜色
  26. // '--header-hover-bgcolor': 'rgba(205,229,253, 0.3)' = #f5fafe
  27. '--header-hover-bgcolor': '#f5fafe',
  28. '--header-highlight-bgcolor': '#f5fafe',
  29. '--highlight-bgcolor': '#f5fafe',
  30. };
  31. StickyTable.propTypes = {
  32. columns: array.isRequired,
  33. dataSource: array.isRequired,
  34. loading: bool,
  35. };
  36. StickyTable.defaultProps = {
  37. loading: false,
  38. };
  39. function StickyTable({ dataSource, columns, loading }) {
  40. // 选中高亮的当前行
  41. const [currentIndex, setCurrentIndex] = useState(null);
  42. function getRowProps(record, rowIndex) {
  43. return {
  44. style:
  45. rowIndex === currentIndex
  46. ? { '--bgcolor': '#eff5fe', '--hover-bgcolor': '#eff5fe' }
  47. : { '--bgcolor': '#fff' },
  48. onClick() {
  49. setCurrentIndex(rowIndex);
  50. },
  51. };
  52. }
  53. const pipeline = useTablePipeline()
  54. .input({ dataSource, columns })
  55. .use(
  56. features.sort({
  57. mode: 'single',
  58. // 默认排序的列
  59. // defaultSorts: [{ code: 'area', order: 'desc' }],
  60. orders: ['desc', 'asc'],
  61. highlightColumnWhenActive: true,
  62. }),
  63. )
  64. .use( // 拖拽列
  65. features.columnResize({
  66. fallbackSize: 120,
  67. // handleBackground: '#ddd',
  68. handleHoverBackground: 'rgba(229,243,255,0.5)',
  69. handleActiveBackground: '#e5f3ff',
  70. }),
  71. )
  72. // .use(features.columnRangeHover()); // 鼠标hover 高亮当前列
  73. return (
  74. <BaseTable
  75. {...pipeline.getProps()}
  76. isLoading={loading}
  77. getRowProps={getRowProps}
  78. style={style}
  79. className={styles.table}
  80. components={{
  81. LoadingIcon: BlockSpin,
  82. EmptyContent:() => <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>,
  83. }}
  84. />
  85. );
  86. }
  87. export default StickyTable;

style.module.less

  1. .table {
  2. th, td, div {
  3. word-break: break-all; // 强制英文单词断行
  4. word-wrap: break-word; // 自动换行
  5. white-space: break-spaces;
  6. }
  7. th {
  8. font-weight: 500 !important;
  9. }
  10. td {
  11. transition:
  12. text-decoration ease-in 200ms,
  13. font-weight ease 300ms;
  14. }
  15. a {
  16. color: inherit;
  17. &:hover {
  18. text-decoration: underline;
  19. }
  20. }
  21. }

LoadingContentWrapper

LoadingContentWrapper文档,自定义加载中的状态
https://ali-react-table.js.org/docs/table/api/

  1. function LoadingContentWrapper({ children, visible }) {
  2. console.log('bisib', visible)
  3. // visible 表示表格是否处于加载状态中
  4. // children 是表格的实际内容
  5. return (
  6. <Spin spinning={visible}>
  7. {children}
  8. </Spin>
  9. )
  10. }