shineout 3.10.3-beta.2 → 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.2'
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.2');
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
 
@@ -67345,6 +67345,13 @@ function useScrollbarWidth() {
67345
67345
 
67346
67346
 
67347
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
+ };
67348
67355
  var getHideExpandCol = function getHideExpandCol() {
67349
67356
  var cols = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
67350
67357
  var expandCol = cols.find(function (col) {
@@ -67380,6 +67387,8 @@ var useColumns = function useColumns(props) {
67380
67387
  var _useRef = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useRef)({
67381
67388
  cachedColumns: null,
67382
67389
  oldColumns: null,
67390
+ oldShowCheckbox: undefined,
67391
+ columnsSnapshot: null,
67383
67392
  groupLevel: 0,
67384
67393
  expandHideCol: null
67385
67394
  }),
@@ -67391,6 +67400,11 @@ var useColumns = function useColumns(props) {
67391
67400
  if (columnsA === context.oldColumns) {
67392
67401
  return context.cachedColumns;
67393
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;
67394
67408
  context.expandHideCol = getHideExpandCol(columnsA);
67395
67409
  var columns = columnsA.filter(function (c) {
67396
67410
  return typeof_default()(c) === 'object';
@@ -67426,6 +67440,10 @@ var useColumns = function useColumns(props) {
67426
67440
  });
67427
67441
  });
67428
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;
67429
67447
  return context.cachedColumns;
67430
67448
  });
67431
67449
  var columns = getColumns(propsColumns) || [];
@@ -70044,10 +70062,10 @@ function Td(props) {
70044
70062
 
70045
70063
  var tr_toNum = toNum;
70046
70064
  var Tr = function Tr(props) {
70047
- 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;
70048
70066
  var treeFunc = props.treeFunc,
70049
- jssStyle = props.jssStyle;
70050
- 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;
70051
70069
  var trRef = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useRef)(null);
70052
70070
  var expandRef = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useRef)(null);
70053
70071
  var config = useConfig();
@@ -70094,9 +70112,14 @@ var Tr = function Tr(props) {
70094
70112
  }
70095
70113
  });
70096
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;
70097
70120
  (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function () {
70098
70121
  // 祖先元素不可见时(display: none)
70099
- if (props.strictRowHeight || !trRef.current || !trRef.current.offsetParent) return;
70122
+ if (!shouldObserveRowHeight || !trRef.current || !trRef.current.offsetParent) return;
70100
70123
  var cancelObserver = addResizeObserver(trRef.current, setVirtualRowHeight, {
70101
70124
  direction: 'y',
70102
70125
  lazy: true
@@ -70104,7 +70127,7 @@ var Tr = function Tr(props) {
70104
70127
  return function () {
70105
70128
  cancelObserver();
70106
70129
  };
70107
- }, []);
70130
+ }, [shouldObserveRowHeight]);
70108
70131
  var _useState = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useState)(false),
70109
70132
  _useState2 = slicedToArray_default()(_useState, 2),
70110
70133
  isExpandLoading = _useState2[0],
@@ -70352,7 +70375,6 @@ var Tr = function Tr(props) {
70352
70375
  }
70353
70376
  }
70354
70377
  };
70355
- 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];
70356
70378
  var isNotExpandableElement = function isNotExpandableElement(el) {
70357
70379
  var tagName = el.tagName;
70358
70380
  if (tagName === 'TD' || tagName === 'TR') return false;
@@ -70445,13 +70467,48 @@ var Tr = function Tr(props) {
70445
70467
  })), renderExpand()]
70446
70468
  });
70447
70469
  };
70448
- /* 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));
70449
70505
  ;// CONCATENATED MODULE: ../base/src/table/tbody.tsx
70450
70506
 
70451
70507
 
70452
70508
 
70453
70509
 
70454
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;
70455
70512
  var _props$columns = props.columns,
70456
70513
  columns = _props$columns === void 0 ? [] : _props$columns,
70457
70514
  _props$currentRowInde = props.currentRowIndex,
@@ -70481,6 +70538,23 @@ var Tr = function Tr(props) {
70481
70538
  var expandCol = props.expandHideCol || columns.find(function (col) {
70482
70539
  return col.type === 'expand' || col.type === 'row-expand';
70483
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]);
70484
70558
  var renderRow = function renderRow(item, index) {
70485
70559
  var _props$rowEvents;
70486
70560
  var rowIndex = index + currentRowIndex;
@@ -70492,6 +70566,8 @@ var Tr = function Tr(props) {
70492
70566
  columns: columns,
70493
70567
  isScrollX: props.isScrollX,
70494
70568
  jssStyle: props.jssStyle,
70569
+ tableClasses: tableClasses,
70570
+ preventClasses: preventClasses,
70495
70571
  colgroup: props.colgroup,
70496
70572
  rowClassName: props.rowClassName,
70497
70573
  rawData: item,
@@ -70529,6 +70605,7 @@ var Tr = function Tr(props) {
70529
70605
  virtual: props.virtual,
70530
70606
  scrolling: props.scrolling,
70531
70607
  strictRowHeight: props.strictRowHeight,
70608
+ rowMemo: props.rowMemo,
70532
70609
  bodyRowSemClass: props.bodyRowSemClass,
70533
70610
  bodyRowSemStyle: props.bodyRowSemStyle,
70534
70611
  bodyCellSemClass: props.bodyCellSemClass,
@@ -70694,9 +70771,6 @@ var table_excluded = ["data"];
70694
70771
 
70695
70772
  var table_devUseWarning = devUseWarning;
70696
70773
  var table_emptyArr = [];
70697
- var emptyRef = {
70698
- current: null
70699
- };
70700
70774
  function Table(props) {
70701
70775
  var _props$jssStyle, _props$jssStyle$table, _columns$find;
70702
70776
  var _props$verticalAlign = props.verticalAlign,
@@ -70773,13 +70847,6 @@ function Table(props) {
70773
70847
  setScrollAble(isScrollAble);
70774
70848
  }, [virtual]);
70775
70849
 
70776
- // TODO: 没用的tbodyHeight,有空移除了
70777
- // 虚拟列表高度另外计算
70778
- var _useResize = useResize({
70779
- targetRef: virtual ? emptyRef : tbodyRef
70780
- }),
70781
- tbodyHeight = _useResize.height;
70782
-
70783
70850
  // default height
70784
70851
  var defaultHeight = virtual && !props.height && !props.virtualScrollContainer ? '100%' : props.height;
70785
70852
  var selection = use_table_select({
@@ -70797,7 +70864,8 @@ function Table(props) {
70797
70864
  data: props.data,
70798
70865
  virtualColumn: props.virtualColumn,
70799
70866
  scrollRef: scrollRef,
70800
- showCheckbox: typeof props.onRowSelect === 'function'
70867
+ showCheckbox: typeof props.onRowSelect === 'function',
70868
+ reuseEqualColumns: !!props.rowMemo
70801
70869
  }),
70802
70870
  columns = _useTableColumns.columns,
70803
70871
  expandHideCol = _useTableColumns.expandHideCol,
@@ -71095,6 +71163,7 @@ function Table(props) {
71095
71163
  treeCheckAll: props.treeCheckAll,
71096
71164
  onCellClick: props.onCellClick,
71097
71165
  strictRowHeight: props.strictRowHeight,
71166
+ rowMemo: props.rowMemo,
71098
71167
  scrollRef: scrollRef,
71099
71168
  bodyRowSemClass: semClass('bodyRow'),
71100
71169
  bodyRowSemStyle: semStyle('bodyRow'),
@@ -71329,8 +71398,11 @@ function Table(props) {
71329
71398
  flex: 1
71330
71399
  },
71331
71400
  wrapperRef: scrollRef,
71332
- scrollWidth: width || 1,
71333
- 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,
71334
71406
  onScroll: handleVirtualScroll,
71335
71407
  defaultHeight: context.emptyHeight,
71336
71408
  isScrollY: isScrollY,
@@ -80212,7 +80284,7 @@ var watermark_interface = __webpack_require__(6640);
80212
80284
 
80213
80285
 
80214
80286
  /* harmony default export */ var src_0 = ({
80215
- version: '3.10.3-beta.2'
80287
+ version: '3.10.3-beta.3'
80216
80288
  });
80217
80289
  }();
80218
80290
  /******/ return __webpack_exports__;