index.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import { useContext } from '@rc-component/context';
  2. import * as React from 'react';
  3. import PerfContext from "../context/PerfContext";
  4. import TableContext, { responseImmutable } from "../context/TableContext";
  5. import useFlattenRecords from "../hooks/useFlattenRecords";
  6. import devRenderTimes from "../hooks/useRenderTimes";
  7. import { getColumnsKey } from "../utils/valueUtil";
  8. import BodyRow from "./BodyRow";
  9. import ExpandedRow from "./ExpandedRow";
  10. import MeasureRow from "./MeasureRow";
  11. function Body(props) {
  12. if (process.env.NODE_ENV !== 'production') {
  13. devRenderTimes(props);
  14. }
  15. var data = props.data,
  16. measureColumnWidth = props.measureColumnWidth;
  17. var _useContext = useContext(TableContext, ['prefixCls', 'getComponent', 'onColumnResize', 'flattenColumns', 'getRowKey', 'expandedKeys', 'childrenColumnName', 'emptyNode', 'expandedRowOffset', 'fixedInfoList', 'colWidths']),
  18. prefixCls = _useContext.prefixCls,
  19. getComponent = _useContext.getComponent,
  20. onColumnResize = _useContext.onColumnResize,
  21. flattenColumns = _useContext.flattenColumns,
  22. getRowKey = _useContext.getRowKey,
  23. expandedKeys = _useContext.expandedKeys,
  24. childrenColumnName = _useContext.childrenColumnName,
  25. emptyNode = _useContext.emptyNode,
  26. _useContext$expandedR = _useContext.expandedRowOffset,
  27. expandedRowOffset = _useContext$expandedR === void 0 ? 0 : _useContext$expandedR,
  28. colWidths = _useContext.colWidths;
  29. var flattenData = useFlattenRecords(data, childrenColumnName, expandedKeys, getRowKey);
  30. var rowKeys = React.useMemo(function () {
  31. return flattenData.map(function (item) {
  32. return item.rowKey;
  33. });
  34. }, [flattenData]);
  35. // =================== Performance ====================
  36. var perfRef = React.useRef({
  37. renderWithProps: false
  38. });
  39. // ===================== Expanded =====================
  40. // `expandedRowOffset` data is same for all the rows.
  41. // Let's calc on Body side to save performance.
  42. var expandedRowInfo = React.useMemo(function () {
  43. var expandedColSpan = flattenColumns.length - expandedRowOffset;
  44. var expandedStickyStart = 0;
  45. for (var i = 0; i < expandedRowOffset; i += 1) {
  46. expandedStickyStart += colWidths[i] || 0;
  47. }
  48. return {
  49. offset: expandedRowOffset,
  50. colSpan: expandedColSpan,
  51. sticky: expandedStickyStart
  52. };
  53. }, [flattenColumns.length, expandedRowOffset, colWidths]);
  54. // ====================== Render ======================
  55. var WrapperComponent = getComponent(['body', 'wrapper'], 'tbody');
  56. var trComponent = getComponent(['body', 'row'], 'tr');
  57. var tdComponent = getComponent(['body', 'cell'], 'td');
  58. var thComponent = getComponent(['body', 'cell'], 'th');
  59. var rows;
  60. if (data.length) {
  61. rows = flattenData.map(function (item, idx) {
  62. var record = item.record,
  63. indent = item.indent,
  64. renderIndex = item.index,
  65. rowKey = item.rowKey;
  66. return /*#__PURE__*/React.createElement(BodyRow, {
  67. key: rowKey,
  68. rowKey: rowKey,
  69. rowKeys: rowKeys,
  70. record: record,
  71. index: idx,
  72. renderIndex: renderIndex,
  73. rowComponent: trComponent,
  74. cellComponent: tdComponent,
  75. scopeCellComponent: thComponent,
  76. indent: indent
  77. // Expanded row info
  78. ,
  79. expandedRowInfo: expandedRowInfo
  80. });
  81. });
  82. } else {
  83. rows = /*#__PURE__*/React.createElement(ExpandedRow, {
  84. expanded: true,
  85. className: "".concat(prefixCls, "-placeholder"),
  86. prefixCls: prefixCls,
  87. component: trComponent,
  88. cellComponent: tdComponent,
  89. colSpan: flattenColumns.length,
  90. isEmpty: true
  91. }, emptyNode);
  92. }
  93. var columnsKey = getColumnsKey(flattenColumns);
  94. return /*#__PURE__*/React.createElement(PerfContext.Provider, {
  95. value: perfRef.current
  96. }, /*#__PURE__*/React.createElement(WrapperComponent, {
  97. className: "".concat(prefixCls, "-tbody")
  98. }, measureColumnWidth && /*#__PURE__*/React.createElement(MeasureRow, {
  99. prefixCls: prefixCls,
  100. columnsKey: columnsKey,
  101. onColumnResize: onColumnResize,
  102. columns: flattenColumns
  103. }), rows));
  104. }
  105. if (process.env.NODE_ENV !== 'production') {
  106. Body.displayName = 'Body';
  107. }
  108. export default responseImmutable(Body);