useCellRender.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
  2. import _typeof from "@babel/runtime/helpers/esm/typeof";
  3. import useMemo from "rc-util/es/hooks/useMemo";
  4. import isEqual from "rc-util/es/isEqual";
  5. import getValue from "rc-util/es/utils/get";
  6. import warning from "rc-util/es/warning";
  7. import * as React from 'react';
  8. import PerfContext from "../context/PerfContext";
  9. import { validateValue } from "../utils/valueUtil";
  10. import { useImmutableMark } from "../context/TableContext";
  11. function isRenderCell(data) {
  12. return data && _typeof(data) === 'object' && !Array.isArray(data) && ! /*#__PURE__*/React.isValidElement(data);
  13. }
  14. export default function useCellRender(record, dataIndex, renderIndex, children, render, shouldCellUpdate) {
  15. // TODO: Remove this after next major version
  16. var perfRecord = React.useContext(PerfContext);
  17. var mark = useImmutableMark();
  18. // ======================== Render ========================
  19. var retData = useMemo(function () {
  20. if (validateValue(children)) {
  21. return [children];
  22. }
  23. var path = dataIndex === null || dataIndex === undefined || dataIndex === '' ? [] : Array.isArray(dataIndex) ? dataIndex : [dataIndex];
  24. var value = getValue(record, path);
  25. // Customize render node
  26. var returnChildNode = value;
  27. var returnCellProps = undefined;
  28. if (render) {
  29. var renderData = render(value, record, renderIndex);
  30. if (isRenderCell(renderData)) {
  31. if (process.env.NODE_ENV !== 'production') {
  32. warning(false, '`columns.render` return cell props is deprecated with perf issue, please use `onCell` instead.');
  33. }
  34. returnChildNode = renderData.children;
  35. returnCellProps = renderData.props;
  36. perfRecord.renderWithProps = true;
  37. } else {
  38. returnChildNode = renderData;
  39. }
  40. }
  41. return [returnChildNode, returnCellProps];
  42. }, [
  43. // Force update deps
  44. mark,
  45. // Normal deps
  46. record, children, dataIndex, render, renderIndex], function (prev, next) {
  47. if (shouldCellUpdate) {
  48. var _prev = _slicedToArray(prev, 2),
  49. prevRecord = _prev[1];
  50. var _next = _slicedToArray(next, 2),
  51. nextRecord = _next[1];
  52. return shouldCellUpdate(nextRecord, prevRecord);
  53. }
  54. // Legacy mode should always update
  55. if (perfRecord.renderWithProps) {
  56. return true;
  57. }
  58. return !isEqual(prev, next, true);
  59. });
  60. return retData;
  61. }