shineout 3.10.3-beta.1 → 3.10.3-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cjs/index.js CHANGED
@@ -545,5 +545,5 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
545
545
  // 此文件由脚本自动生成,请勿直接修改。
546
546
  // This file was generated automatically by a script. Please do not modify it directly.
547
547
  var _default = exports.default = {
548
- version: '3.10.3-beta.1'
548
+ version: '3.10.3-beta.3'
549
549
  };
package/dist/shineout.js CHANGED
@@ -13736,7 +13736,7 @@ var handleStyle = function handleStyle(style) {
13736
13736
  };
13737
13737
  /* harmony default export */ var jss_style_handleStyle = (handleStyle);
13738
13738
  ;// CONCATENATED MODULE: ../shineout-style/src/version.ts
13739
- /* harmony default export */ var version = ('3.10.3-beta.1');
13739
+ /* harmony default export */ var version = ('3.10.3-beta.3');
13740
13740
  ;// CONCATENATED MODULE: ../shineout-style/src/jss-style/index.tsx
13741
13741
 
13742
13742
 
@@ -54454,6 +54454,47 @@ var SchemaBuilder = /*#__PURE__*/function () {
54454
54454
  }]);
54455
54455
  return SchemaBuilder;
54456
54456
  }();
54457
+ ;// CONCATENATED MODULE: ../hooks/src/components/use-form/flow-guard.ts
54458
+
54459
+
54460
+ /**
54461
+ * 为 Form.Flow 的更新函数加一层守卫:只有 Flow 关心的值发生变化时才触发更新。
54462
+ *
54463
+ * 依赖数据按 immutable 方式更新(结构共享):值没变引用就不变,因此可以用引用比较判断。
54464
+ * - 不带 names(globalKey):对表单根对象做浅比较
54465
+ * - 带 names:逐个比较对应路径的值
54466
+ *
54467
+ * 守卫以 updateFn 为 key 缓存,Flow 因 names 引用变化而重复 watch 时快照不丢失。
54468
+ * 首次通知没有快照,一律放行(Flow 渲染到挂载 watch 之间值可能已变化)。
54469
+ */
54470
+ var createFlowGuard = function createFlowGuard(getFormValue, globalKey) {
54471
+ var guards = new WeakMap();
54472
+ return function (names, updateFn) {
54473
+ var guard = guards.get(updateFn);
54474
+ if (!guard) {
54475
+ var g = {
54476
+ names: names,
54477
+ snapshot: undefined,
54478
+ fn: function fn() {
54479
+ var formValue = getFormValue();
54480
+ var next = g.names.map(function (n) {
54481
+ return n === globalKey ? formValue : deepGet(formValue, n);
54482
+ });
54483
+ var prev = g.snapshot;
54484
+ var same = !!prev && prev.length === next.length && next.every(function (v, i) {
54485
+ return g.names[i] === globalKey ? shallow_equal_shallowEqual(prev[i], v) : prev[i] === v;
54486
+ });
54487
+ g.snapshot = next;
54488
+ if (!same) updateFn();
54489
+ }
54490
+ };
54491
+ guard = g;
54492
+ guards.set(updateFn, g);
54493
+ }
54494
+ guard.names = names;
54495
+ return guard.fn;
54496
+ };
54497
+ };
54457
54498
  ;// CONCATENATED MODULE: ../hooks/src/components/use-form/use-form.ts
54458
54499
 
54459
54500
 
@@ -54468,6 +54509,7 @@ var SchemaBuilder = /*#__PURE__*/function () {
54468
54509
 
54469
54510
 
54470
54511
 
54512
+
54471
54513
  var globalKey = '__global__&&@@';
54472
54514
  var SUBMIT_TIMEOUT = 10;
54473
54515
  var RESET_TIMEOUT = 500;
@@ -54498,7 +54540,9 @@ var useForm = function useForm(props) {
54498
54540
  scrollParent = props.scrollParent,
54499
54541
  isControl = props.isControl,
54500
54542
  _props$validateTrigge = props.validateTrigger,
54501
- validateTrigger = _props$validateTrigge === void 0 ? 'change' : _props$validateTrigge;
54543
+ validateTrigger = _props$validateTrigge === void 0 ? 'change' : _props$validateTrigge,
54544
+ _props$deepClone = props.deepClone,
54545
+ shouldDeepClone = _props$deepClone === void 0 ? true : _props$deepClone;
54502
54546
  var deepSetOptions = {
54503
54547
  removeUndefined: removeUndefined,
54504
54548
  forceSet: true
@@ -54514,7 +54558,8 @@ var useForm = function useForm(props) {
54514
54558
  removeArr: new Set(),
54515
54559
  names: new Set(),
54516
54560
  submitLock: false,
54517
- value: deepClone(props.value) || emptyObj,
54561
+ // deepClone 为 false 时跳过全量深拷贝,与外部 value 共享引用(依赖 immer 不可变更新)
54562
+ value: (shouldDeepClone ? deepClone(props.value) : props.value) || emptyObj,
54518
54563
  errors: {},
54519
54564
  serverErrors: {},
54520
54565
  lastValue: props.value || emptyObj,
@@ -54649,6 +54694,13 @@ var useForm = function useForm(props) {
54649
54694
  }
54650
54695
  });
54651
54696
  });
54697
+
54698
+ // deepClone 为 false 时,Flow 仅在其关心的值变化时才更新(见 flow-guard.ts)
54699
+ var getFlowGuard = external_root_React_commonjs2_react_commonjs_react_amd_react_.useMemo(function () {
54700
+ return createFlowGuard(function () {
54701
+ return context.value;
54702
+ }, globalKey);
54703
+ }, []);
54652
54704
  var update = function update(name) {
54653
54705
  var _context$flowMap$glob;
54654
54706
  if (!name) {
@@ -55055,9 +55107,10 @@ var useForm = function useForm(props) {
55055
55107
  watch: function watch() {
55056
55108
  var names = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [globalKey];
55057
55109
  var updateFn = arguments.length > 1 ? arguments[1] : undefined;
55110
+ var fn = shouldDeepClone ? updateFn : getFlowGuard(names, updateFn);
55058
55111
  names.forEach(function (name) {
55059
55112
  context.flowMap[name] = context.flowMap[name] || new Set();
55060
- context.flowMap[name].add(updateFn);
55113
+ context.flowMap[name].add(fn);
55061
55114
  });
55062
55115
  },
55063
55116
  unWatch: function unWatch() {
@@ -55065,7 +55118,7 @@ var useForm = function useForm(props) {
55065
55118
  var updateFn = arguments.length > 1 ? arguments[1] : undefined;
55066
55119
  names.forEach(function (name) {
55067
55120
  if (updateFn) {
55068
- context.flowMap[name].delete(updateFn);
55121
+ context.flowMap[name].delete(shouldDeepClone ? updateFn : getFlowGuard(names, updateFn));
55069
55122
  } else {
55070
55123
  delete context.flowMap[name];
55071
55124
  }
@@ -55112,7 +55165,7 @@ var useForm = function useForm(props) {
55112
55165
  }, [labelWidth, labelAlign, labelVerticalAlign, keepErrorHeight, inline, disabled, size, formName, colon, validateTrigger]);
55113
55166
  var updateValue = function updateValue() {
55114
55167
  if (props.value !== context.lastValue && props.value !== context.value) {
55115
- context.value = deepClone(props.value) || emptyObj;
55168
+ context.value = (shouldDeepClone ? deepClone(props.value) : props.value) || emptyObj;
55116
55169
  }
55117
55170
  context.lastValue = props.value;
55118
55171
  };
@@ -67292,6 +67345,13 @@ function useScrollbarWidth() {
67292
67345
 
67293
67346
 
67294
67347
 
67348
+
67349
+ // 逐列浅比较:业务常见写法 columns.map(c => ({ ...c })) 每次都会产生新对象,但内容(含 render 引用)不变
67350
+ var isColumnsShallowEqual = function isColumnsShallowEqual(a, b) {
67351
+ return a.length === b.length && a.every(function (c, i) {
67352
+ return shallow_equal(c, b[i]);
67353
+ });
67354
+ };
67295
67355
  var getHideExpandCol = function getHideExpandCol() {
67296
67356
  var cols = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
67297
67357
  var expandCol = cols.find(function (col) {
@@ -67327,6 +67387,8 @@ var useColumns = function useColumns(props) {
67327
67387
  var _useRef = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useRef)({
67328
67388
  cachedColumns: null,
67329
67389
  oldColumns: null,
67390
+ oldShowCheckbox: undefined,
67391
+ columnsSnapshot: null,
67330
67392
  groupLevel: 0,
67331
67393
  expandHideCol: null
67332
67394
  }),
@@ -67338,6 +67400,11 @@ var useColumns = function useColumns(props) {
67338
67400
  if (columnsA === context.oldColumns) {
67339
67401
  return context.cachedColumns;
67340
67402
  }
67403
+ if (props.reuseEqualColumns && context.columnsSnapshot && context.cachedColumns && context.oldShowCheckbox === props.showCheckbox && isColumnsShallowEqual(columnsA, context.columnsSnapshot)) {
67404
+ context.oldColumns = columnsA;
67405
+ return context.cachedColumns;
67406
+ }
67407
+ context.oldShowCheckbox = props.showCheckbox;
67341
67408
  context.expandHideCol = getHideExpandCol(columnsA);
67342
67409
  var columns = columnsA.filter(function (c) {
67343
67410
  return typeof_default()(c) === 'object';
@@ -67373,6 +67440,10 @@ var useColumns = function useColumns(props) {
67373
67440
  });
67374
67441
  });
67375
67442
  context.oldColumns = columnsA;
67443
+ // 与快照比较而非与旧数组比较:列对象被原地修改时旧数组里也是同一个对象,比较不出差异
67444
+ context.columnsSnapshot = props.reuseEqualColumns ? columnsA.map(function (c) {
67445
+ return c && typeof_default()(c) === 'object' ? objectSpread2_default()({}, c) : c;
67446
+ }) : null;
67376
67447
  return context.cachedColumns;
67377
67448
  });
67378
67449
  var columns = getColumns(propsColumns) || [];
@@ -69991,10 +70062,10 @@ function Td(props) {
69991
70062
 
69992
70063
  var tr_toNum = toNum;
69993
70064
  var Tr = function Tr(props) {
69994
- var _props$jssStyle, _props$jssStyle$table, _jssStyle$input, _jssStyle$select, _jssStyle$datePicker, _jssStyle$treeSelect, _jssStyle$switch, _jssStyle$checkbox, _jssStyle$radio, _jssStyle$cascader, _props$rowClassName;
70065
+ var _props$rowClassName;
69995
70066
  var treeFunc = props.treeFunc,
69996
- jssStyle = props.jssStyle;
69997
- var tableClasses = (_props$jssStyle = props.jssStyle) === null || _props$jssStyle === void 0 || (_props$jssStyle$table = _props$jssStyle.table) === null || _props$jssStyle$table === void 0 ? void 0 : _props$jssStyle$table.call(_props$jssStyle);
70067
+ tableClasses = props.tableClasses,
70068
+ preventClasses = props.preventClasses;
69998
70069
  var trRef = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useRef)(null);
69999
70070
  var expandRef = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useRef)(null);
70000
70071
  var config = useConfig();
@@ -70041,9 +70112,14 @@ var Tr = function Tr(props) {
70041
70112
  }
70042
70113
  });
70043
70114
  (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(setVirtualRowHeight, [props.expanded, props.rowIndex, props.bodyScrollWidth, props.resizeFlag]);
70115
+
70116
+ // 行高只在虚拟列表下需要上报(setRowHeight 仅由虚拟列表传入),
70117
+ // 非虚拟场景(sticky-only / 普通表格)不再为每一行创建 ResizeObserver,
70118
+ // 避免数据切换时批量 observe/disconnect 以及 RO 首次回调带来的布局读取(计入 INP presentation delay)
70119
+ var shouldObserveRowHeight = !!props.setRowHeight && !props.strictRowHeight;
70044
70120
  (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function () {
70045
70121
  // 祖先元素不可见时(display: none)
70046
- if (props.strictRowHeight || !trRef.current || !trRef.current.offsetParent) return;
70122
+ if (!shouldObserveRowHeight || !trRef.current || !trRef.current.offsetParent) return;
70047
70123
  var cancelObserver = addResizeObserver(trRef.current, setVirtualRowHeight, {
70048
70124
  direction: 'y',
70049
70125
  lazy: true
@@ -70051,7 +70127,7 @@ var Tr = function Tr(props) {
70051
70127
  return function () {
70052
70128
  cancelObserver();
70053
70129
  };
70054
- }, []);
70130
+ }, [shouldObserveRowHeight]);
70055
70131
  var _useState = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useState)(false),
70056
70132
  _useState2 = slicedToArray_default()(_useState, 2),
70057
70133
  isExpandLoading = _useState2[0],
@@ -70299,7 +70375,6 @@ var Tr = function Tr(props) {
70299
70375
  }
70300
70376
  }
70301
70377
  };
70302
- var preventClasses = [jssStyle === null || jssStyle === void 0 || (_jssStyle$input = jssStyle.input) === null || _jssStyle$input === void 0 ? void 0 : _jssStyle$input.call(jssStyle).wrapper, jssStyle === null || jssStyle === void 0 || (_jssStyle$select = jssStyle.select) === null || _jssStyle$select === void 0 ? void 0 : _jssStyle$select.call(jssStyle).wrapper, jssStyle === null || jssStyle === void 0 || (_jssStyle$datePicker = jssStyle.datePicker) === null || _jssStyle$datePicker === void 0 ? void 0 : _jssStyle$datePicker.call(jssStyle).wrapper, jssStyle === null || jssStyle === void 0 || (_jssStyle$treeSelect = jssStyle.treeSelect) === null || _jssStyle$treeSelect === void 0 ? void 0 : _jssStyle$treeSelect.call(jssStyle).wrapper, jssStyle === null || jssStyle === void 0 || (_jssStyle$switch = jssStyle.switch) === null || _jssStyle$switch === void 0 ? void 0 : _jssStyle$switch.call(jssStyle).wrapper, jssStyle === null || jssStyle === void 0 || (_jssStyle$checkbox = jssStyle.checkbox) === null || _jssStyle$checkbox === void 0 ? void 0 : _jssStyle$checkbox.call(jssStyle).wrapper, jssStyle === null || jssStyle === void 0 || (_jssStyle$radio = jssStyle.radio) === null || _jssStyle$radio === void 0 ? void 0 : _jssStyle$radio.call(jssStyle).wrapper, jssStyle === null || jssStyle === void 0 || (_jssStyle$cascader = jssStyle.cascader) === null || _jssStyle$cascader === void 0 ? void 0 : _jssStyle$cascader.call(jssStyle).wrapper];
70303
70378
  var isNotExpandableElement = function isNotExpandableElement(el) {
70304
70379
  var tagName = el.tagName;
70305
70380
  if (tagName === 'TD' || tagName === 'TR') return false;
@@ -70392,13 +70467,48 @@ var Tr = function Tr(props) {
70392
70467
  })), renderExpand()]
70393
70468
  });
70394
70469
  };
70395
- /* harmony default export */ var tr = (Tr);
70470
+
70471
+ // 行级 memo(rowMemo)比较时跳过的 props:
70472
+ // - datum / treeFunc / handleCellHover / handleExpandClick:内部方法均为 usePersistFn,引用变化不影响渲染结果
70473
+ // (选中、禁用、展开状态已经以 isSelect / disabled / expanded / treeExpandLevel 的形式单独下发)
70474
+ // - row / hoverIndex / 语义化样式:引用每次都可能变化,下面按内容单独比较
70475
+ // - treeExpandLevel:随 data 每次重建,非树形表格不会读取;树形表格下单独按引用比较
70476
+ var MEMO_SKIP_KEYS = ['datum', 'treeFunc', 'handleCellHover', 'handleExpandClick', 'row', 'hoverIndex', 'bodyRowSemStyle', 'bodyCellSemStyle', 'treeExpandLevel'];
70477
+
70478
+ // rowData 在 data 变化时会整体重算(如懒加载追加数据),按单元格内容比较,避免未变化的行被连带重渲染
70479
+ var isSameRowCells = function isSameRowCells(prev, next) {
70480
+ if (prev === next) return true;
70481
+ if (prev.length !== next.length) return false;
70482
+ return prev.every(function (cell, i) {
70483
+ var nextCell = next[i];
70484
+ if (!cell || !nextCell) return cell === nextCell;
70485
+ return cell.data === nextCell.data && cell.colSpan === nextCell.colSpan && cell.rowSpan === nextCell.rowSpan;
70486
+ });
70487
+ };
70488
+ var isSameHover = function isSameHover(prev, next) {
70489
+ if (prev.hoverIndex === next.hoverIndex || !next.hover) return true;
70490
+ // 存在跨行单元格时 hover 态取决于后续行,保守处理为需要更新
70491
+ if (next.row.some(function (cell) {
70492
+ return cell && cell.rowSpan > 1;
70493
+ })) return false;
70494
+ return prev.hoverIndex.has(prev.rowIndex) === next.hoverIndex.has(next.rowIndex);
70495
+ };
70496
+
70497
+ // 未开启 rowMemo 时始终返回 false,行为与不做 memo 完全一致
70498
+ var isTrPropsEqual = function isTrPropsEqual(prev, next) {
70499
+ if (!prev.rowMemo || !next.rowMemo) return false;
70500
+ return shallow_equal_shallowEqual(prev, next, {
70501
+ skip: MEMO_SKIP_KEYS
70502
+ }) && (!next.treeColumnsName || prev.treeExpandLevel === next.treeExpandLevel) && isSameRowCells(prev.row, next.row) && isSameHover(prev, next) && shallow_equal_shallowEqual(prev.bodyRowSemStyle, next.bodyRowSemStyle) && shallow_equal_shallowEqual(prev.bodyCellSemStyle, next.bodyCellSemStyle);
70503
+ };
70504
+ /* harmony default export */ var tr = (/*#__PURE__*/external_root_React_commonjs2_react_commonjs_react_amd_react_default().memo(Tr, isTrPropsEqual));
70396
70505
  ;// CONCATENATED MODULE: ../base/src/table/tbody.tsx
70397
70506
 
70398
70507
 
70399
70508
 
70400
70509
 
70401
70510
  /* harmony default export */ var tbody = (function (props) {
70511
+ var _jssStyle$table, _jssStyle$input, _jssStyle$select, _jssStyle$datePicker, _jssStyle$treeSelect, _jssStyle$switch, _jssStyle$checkbox, _jssStyle$radio, _jssStyle$cascader;
70402
70512
  var _props$columns = props.columns,
70403
70513
  columns = _props$columns === void 0 ? [] : _props$columns,
70404
70514
  _props$currentRowInde = props.currentRowIndex,
@@ -70428,6 +70538,23 @@ var Tr = function Tr(props) {
70428
70538
  var expandCol = props.expandHideCol || columns.find(function (col) {
70429
70539
  return col.type === 'expand' || col.type === 'row-expand';
70430
70540
  });
70541
+
70542
+ // 样式 hook 在 Tbody 统一调用一次再下发给 Tr,
70543
+ // 避免每一行都执行 9 次 react-jss useStyles(每次都带 useLayoutEffect/useEffect),行数多时开销明显
70544
+ var jssStyle = props.jssStyle;
70545
+ var tableClasses = jssStyle === null || jssStyle === void 0 || (_jssStyle$table = jssStyle.table) === null || _jssStyle$table === void 0 ? void 0 : _jssStyle$table.call(jssStyle);
70546
+ var inputWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$input = jssStyle.input) === null || _jssStyle$input === void 0 ? void 0 : _jssStyle$input.call(jssStyle).wrapper;
70547
+ var selectWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$select = jssStyle.select) === null || _jssStyle$select === void 0 ? void 0 : _jssStyle$select.call(jssStyle).wrapper;
70548
+ var datePickerWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$datePicker = jssStyle.datePicker) === null || _jssStyle$datePicker === void 0 ? void 0 : _jssStyle$datePicker.call(jssStyle).wrapper;
70549
+ var treeSelectWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$treeSelect = jssStyle.treeSelect) === null || _jssStyle$treeSelect === void 0 ? void 0 : _jssStyle$treeSelect.call(jssStyle).wrapper;
70550
+ var switchWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$switch = jssStyle.switch) === null || _jssStyle$switch === void 0 ? void 0 : _jssStyle$switch.call(jssStyle).wrapper;
70551
+ var checkboxWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$checkbox = jssStyle.checkbox) === null || _jssStyle$checkbox === void 0 ? void 0 : _jssStyle$checkbox.call(jssStyle).wrapper;
70552
+ var radioWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$radio = jssStyle.radio) === null || _jssStyle$radio === void 0 ? void 0 : _jssStyle$radio.call(jssStyle).wrapper;
70553
+ var cascaderWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$cascader = jssStyle.cascader) === null || _jssStyle$cascader === void 0 ? void 0 : _jssStyle$cascader.call(jssStyle).wrapper;
70554
+ // 行点击时用于判断点击目标是否为表单控件(不触发 onRowClick / 行展开)
70555
+ var preventClasses = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useMemo)(function () {
70556
+ return [inputWrapper, selectWrapper, datePickerWrapper, treeSelectWrapper, switchWrapper, checkboxWrapper, radioWrapper, cascaderWrapper];
70557
+ }, [inputWrapper, selectWrapper, datePickerWrapper, treeSelectWrapper, switchWrapper, checkboxWrapper, radioWrapper, cascaderWrapper]);
70431
70558
  var renderRow = function renderRow(item, index) {
70432
70559
  var _props$rowEvents;
70433
70560
  var rowIndex = index + currentRowIndex;
@@ -70439,6 +70566,8 @@ var Tr = function Tr(props) {
70439
70566
  columns: columns,
70440
70567
  isScrollX: props.isScrollX,
70441
70568
  jssStyle: props.jssStyle,
70569
+ tableClasses: tableClasses,
70570
+ preventClasses: preventClasses,
70442
70571
  colgroup: props.colgroup,
70443
70572
  rowClassName: props.rowClassName,
70444
70573
  rawData: item,
@@ -70476,6 +70605,7 @@ var Tr = function Tr(props) {
70476
70605
  virtual: props.virtual,
70477
70606
  scrolling: props.scrolling,
70478
70607
  strictRowHeight: props.strictRowHeight,
70608
+ rowMemo: props.rowMemo,
70479
70609
  bodyRowSemClass: props.bodyRowSemClass,
70480
70610
  bodyRowSemStyle: props.bodyRowSemStyle,
70481
70611
  bodyCellSemClass: props.bodyCellSemClass,
@@ -70641,9 +70771,6 @@ var table_excluded = ["data"];
70641
70771
 
70642
70772
  var table_devUseWarning = devUseWarning;
70643
70773
  var table_emptyArr = [];
70644
- var emptyRef = {
70645
- current: null
70646
- };
70647
70774
  function Table(props) {
70648
70775
  var _props$jssStyle, _props$jssStyle$table, _columns$find;
70649
70776
  var _props$verticalAlign = props.verticalAlign,
@@ -70720,13 +70847,6 @@ function Table(props) {
70720
70847
  setScrollAble(isScrollAble);
70721
70848
  }, [virtual]);
70722
70849
 
70723
- // TODO: 没用的tbodyHeight,有空移除了
70724
- // 虚拟列表高度另外计算
70725
- var _useResize = useResize({
70726
- targetRef: virtual ? emptyRef : tbodyRef
70727
- }),
70728
- tbodyHeight = _useResize.height;
70729
-
70730
70850
  // default height
70731
70851
  var defaultHeight = virtual && !props.height && !props.virtualScrollContainer ? '100%' : props.height;
70732
70852
  var selection = use_table_select({
@@ -70744,7 +70864,8 @@ function Table(props) {
70744
70864
  data: props.data,
70745
70865
  virtualColumn: props.virtualColumn,
70746
70866
  scrollRef: scrollRef,
70747
- showCheckbox: typeof props.onRowSelect === 'function'
70867
+ showCheckbox: typeof props.onRowSelect === 'function',
70868
+ reuseEqualColumns: !!props.rowMemo
70748
70869
  }),
70749
70870
  columns = _useTableColumns.columns,
70750
70871
  expandHideCol = _useTableColumns.expandHideCol,
@@ -71042,6 +71163,7 @@ function Table(props) {
71042
71163
  treeCheckAll: props.treeCheckAll,
71043
71164
  onCellClick: props.onCellClick,
71044
71165
  strictRowHeight: props.strictRowHeight,
71166
+ rowMemo: props.rowMemo,
71045
71167
  scrollRef: scrollRef,
71046
71168
  bodyRowSemClass: semClass('bodyRow'),
71047
71169
  bodyRowSemStyle: semStyle('bodyRow'),
@@ -71276,8 +71398,11 @@ function Table(props) {
71276
71398
  flex: 1
71277
71399
  },
71278
71400
  wrapperRef: scrollRef,
71279
- scrollWidth: width || 1,
71280
- scrollHeight: virtual ? virtualInfo.scrollHeight : tbodyHeight,
71401
+ scrollWidth: width || 1
71402
+ // 非虚拟时只有空数据会走到 Scroll,此时 isEmpty 会把 paddingTop 置 0,scrollHeight 不生效;
71403
+ // 原先这里对 tbody 做 useResize 监听,tbody 尺寸变化后会额外触发整表重渲染,已移除
71404
+ ,
71405
+ scrollHeight: virtual ? virtualInfo.scrollHeight : 0,
71281
71406
  onScroll: handleVirtualScroll,
71282
71407
  defaultHeight: context.emptyHeight,
71283
71408
  isScrollY: isScrollY,
@@ -80159,7 +80284,7 @@ var watermark_interface = __webpack_require__(6640);
80159
80284
 
80160
80285
 
80161
80286
  /* harmony default export */ var src_0 = ({
80162
- version: '3.10.3-beta.1'
80287
+ version: '3.10.3-beta.3'
80163
80288
  });
80164
80289
  }();
80165
80290
  /******/ return __webpack_exports__;