shineout 3.10.3-beta.2 → 3.10.3-beta.4

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.4'
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.4');
13740
13740
  ;// CONCATENATED MODULE: ../shineout-style/src/jss-style/index.tsx
13741
13741
 
13742
13742
 
@@ -28694,7 +28694,8 @@ var tableStyle = objectSpread2_default()(objectSpread2_default()({
28694
28694
  boxShadow: 'inset 8px 0 10px -6px rgba(2,11,24,.1)'
28695
28695
  // border: 'none',
28696
28696
  },
28697
- '&[dir=ltr]::after': {
28697
+ // tbody td 在 ltr 下不输出 dir 属性,用 :not([dir=rtl]) 匹配 ltr
28698
+ '&:not([dir=rtl])::after': {
28698
28699
  right: "-".concat(shadowWidth, "px")
28699
28700
  },
28700
28701
  '&[dir=rtl]::after': {
@@ -28731,7 +28732,7 @@ var tableStyle = objectSpread2_default()(objectSpread2_default()({
28731
28732
  right: "-".concat(shadowWidth, "px"),
28732
28733
  boxShadow: 'inset 8px 0 10px -6px rgba(2,11,24,.1)'
28733
28734
  },
28734
- '&[dir=ltr]::before': {
28735
+ '&:not([dir=rtl])::before': {
28735
28736
  left: "-".concat(shadowWidth, "px")
28736
28737
  }
28737
28738
  },
@@ -29012,7 +29013,7 @@ var tableStyle = objectSpread2_default()(objectSpread2_default()({
29012
29013
  textAlign: 'left'
29013
29014
  },
29014
29015
  '$bordered&': {
29015
- '& th:last-child[dir=ltr], & td:last-child[dir=ltr]': {
29016
+ '& th:last-child:not([dir=rtl]), & td:last-child:not([dir=rtl])': {
29016
29017
  borderRight: 'none'
29017
29018
  },
29018
29019
  '& th:last-child[dir=rtl], & td:last-child[dir=rtl]': {
@@ -67345,6 +67346,13 @@ function useScrollbarWidth() {
67345
67346
 
67346
67347
 
67347
67348
 
67349
+
67350
+ // 逐列浅比较:业务常见写法 columns.map(c => ({ ...c })) 每次都会产生新对象,但内容(含 render 引用)不变
67351
+ var isColumnsShallowEqual = function isColumnsShallowEqual(a, b) {
67352
+ return a.length === b.length && a.every(function (c, i) {
67353
+ return shallow_equal(c, b[i]);
67354
+ });
67355
+ };
67348
67356
  var getHideExpandCol = function getHideExpandCol() {
67349
67357
  var cols = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
67350
67358
  var expandCol = cols.find(function (col) {
@@ -67380,6 +67388,8 @@ var useColumns = function useColumns(props) {
67380
67388
  var _useRef = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useRef)({
67381
67389
  cachedColumns: null,
67382
67390
  oldColumns: null,
67391
+ oldShowCheckbox: undefined,
67392
+ columnsSnapshot: null,
67383
67393
  groupLevel: 0,
67384
67394
  expandHideCol: null
67385
67395
  }),
@@ -67391,6 +67401,11 @@ var useColumns = function useColumns(props) {
67391
67401
  if (columnsA === context.oldColumns) {
67392
67402
  return context.cachedColumns;
67393
67403
  }
67404
+ if (props.reuseEqualColumns && context.columnsSnapshot && context.cachedColumns && context.oldShowCheckbox === props.showCheckbox && isColumnsShallowEqual(columnsA, context.columnsSnapshot)) {
67405
+ context.oldColumns = columnsA;
67406
+ return context.cachedColumns;
67407
+ }
67408
+ context.oldShowCheckbox = props.showCheckbox;
67394
67409
  context.expandHideCol = getHideExpandCol(columnsA);
67395
67410
  var columns = columnsA.filter(function (c) {
67396
67411
  return typeof_default()(c) === 'object';
@@ -67426,6 +67441,10 @@ var useColumns = function useColumns(props) {
67426
67441
  });
67427
67442
  });
67428
67443
  context.oldColumns = columnsA;
67444
+ // 与快照比较而非与旧数组比较:列对象被原地修改时旧数组里也是同一个对象,比较不出差异
67445
+ context.columnsSnapshot = props.reuseEqualColumns ? columnsA.map(function (c) {
67446
+ return c && typeof_default()(c) === 'object' ? objectSpread2_default()({}, c) : c;
67447
+ }) : null;
67429
67448
  return context.cachedColumns;
67430
67449
  });
67431
67450
  var columns = getColumns(propsColumns) || [];
@@ -69527,6 +69546,11 @@ var thead_toNum = toNum;
69527
69546
  }),
69528
69547
  context = _useRef.current;
69529
69548
  (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function () {
69549
+ // 行高仅用于多级表头固定列的 sticky top,单行表头 top 恒为 0,跳过测量以避免强制同步布局
69550
+ if (columnLevel === 0) {
69551
+ context.trHeights = [];
69552
+ return;
69553
+ }
69530
69554
  var heights = trRefs.current.map(function (tr) {
69531
69555
  return (tr === null || tr === void 0 ? void 0 : tr.offsetHeight) || 0;
69532
69556
  });
@@ -70015,8 +70039,10 @@ function Td(props) {
70015
70039
  onMouseEnter: onMouseEnter,
70016
70040
  onMouseLeave: onMouseLeave,
70017
70041
  className: className,
70018
- style: props.style,
70019
- dir: direction,
70042
+ style: props.style
70043
+ // ltr 为默认方向,可从 table 继承,省略以减少大数据量下逐个单元格的 setAttribute
70044
+ ,
70045
+ dir: direction === 'rtl' ? direction : undefined,
70020
70046
  "data-role": role,
70021
70047
  onClick: onClick,
70022
70048
  children: renderContent(props.col, props.data)
@@ -70044,10 +70070,10 @@ function Td(props) {
70044
70070
 
70045
70071
  var tr_toNum = toNum;
70046
70072
  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;
70073
+ var _props$rowClassName;
70048
70074
  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);
70075
+ tableClasses = props.tableClasses,
70076
+ preventClasses = props.preventClasses;
70051
70077
  var trRef = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useRef)(null);
70052
70078
  var expandRef = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useRef)(null);
70053
70079
  var config = useConfig();
@@ -70094,9 +70120,14 @@ var Tr = function Tr(props) {
70094
70120
  }
70095
70121
  });
70096
70122
  (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(setVirtualRowHeight, [props.expanded, props.rowIndex, props.bodyScrollWidth, props.resizeFlag]);
70123
+
70124
+ // 行高只在虚拟列表下需要上报(setRowHeight 仅由虚拟列表传入),
70125
+ // 非虚拟场景(sticky-only / 普通表格)不再为每一行创建 ResizeObserver,
70126
+ // 避免数据切换时批量 observe/disconnect 以及 RO 首次回调带来的布局读取(计入 INP presentation delay)
70127
+ var shouldObserveRowHeight = !!props.setRowHeight && !props.strictRowHeight;
70097
70128
  (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useEffect)(function () {
70098
70129
  // 祖先元素不可见时(display: none)
70099
- if (props.strictRowHeight || !trRef.current || !trRef.current.offsetParent) return;
70130
+ if (!shouldObserveRowHeight || !trRef.current || !trRef.current.offsetParent) return;
70100
70131
  var cancelObserver = addResizeObserver(trRef.current, setVirtualRowHeight, {
70101
70132
  direction: 'y',
70102
70133
  lazy: true
@@ -70104,7 +70135,7 @@ var Tr = function Tr(props) {
70104
70135
  return function () {
70105
70136
  cancelObserver();
70106
70137
  };
70107
- }, []);
70138
+ }, [shouldObserveRowHeight]);
70108
70139
  var _useState = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useState)(false),
70109
70140
  _useState2 = slicedToArray_default()(_useState, 2),
70110
70141
  isExpandLoading = _useState2[0],
@@ -70352,7 +70383,6 @@ var Tr = function Tr(props) {
70352
70383
  }
70353
70384
  }
70354
70385
  };
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
70386
  var isNotExpandableElement = function isNotExpandableElement(el) {
70357
70387
  var tagName = el.tagName;
70358
70388
  if (tagName === 'TD' || tagName === 'TR') return false;
@@ -70445,13 +70475,48 @@ var Tr = function Tr(props) {
70445
70475
  })), renderExpand()]
70446
70476
  });
70447
70477
  };
70448
- /* harmony default export */ var tr = (Tr);
70478
+
70479
+ // 行级 memo(rowMemo)比较时跳过的 props:
70480
+ // - datum / treeFunc / handleCellHover / handleExpandClick:内部方法均为 usePersistFn,引用变化不影响渲染结果
70481
+ // (选中、禁用、展开状态已经以 isSelect / disabled / expanded / treeExpandLevel 的形式单独下发)
70482
+ // - row / hoverIndex / 语义化样式:引用每次都可能变化,下面按内容单独比较
70483
+ // - treeExpandLevel:随 data 每次重建,非树形表格不会读取;树形表格下单独按引用比较
70484
+ var MEMO_SKIP_KEYS = ['datum', 'treeFunc', 'handleCellHover', 'handleExpandClick', 'row', 'hoverIndex', 'bodyRowSemStyle', 'bodyCellSemStyle', 'treeExpandLevel'];
70485
+
70486
+ // rowData 在 data 变化时会整体重算(如懒加载追加数据),按单元格内容比较,避免未变化的行被连带重渲染
70487
+ var isSameRowCells = function isSameRowCells(prev, next) {
70488
+ if (prev === next) return true;
70489
+ if (prev.length !== next.length) return false;
70490
+ return prev.every(function (cell, i) {
70491
+ var nextCell = next[i];
70492
+ if (!cell || !nextCell) return cell === nextCell;
70493
+ return cell.data === nextCell.data && cell.colSpan === nextCell.colSpan && cell.rowSpan === nextCell.rowSpan;
70494
+ });
70495
+ };
70496
+ var isSameHover = function isSameHover(prev, next) {
70497
+ if (prev.hoverIndex === next.hoverIndex || !next.hover) return true;
70498
+ // 存在跨行单元格时 hover 态取决于后续行,保守处理为需要更新
70499
+ if (next.row.some(function (cell) {
70500
+ return cell && cell.rowSpan > 1;
70501
+ })) return false;
70502
+ return prev.hoverIndex.has(prev.rowIndex) === next.hoverIndex.has(next.rowIndex);
70503
+ };
70504
+
70505
+ // 未开启 rowMemo 时始终返回 false,行为与不做 memo 完全一致
70506
+ var isTrPropsEqual = function isTrPropsEqual(prev, next) {
70507
+ if (!prev.rowMemo || !next.rowMemo) return false;
70508
+ return shallow_equal_shallowEqual(prev, next, {
70509
+ skip: MEMO_SKIP_KEYS
70510
+ }) && (!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);
70511
+ };
70512
+ /* harmony default export */ var tr = (/*#__PURE__*/external_root_React_commonjs2_react_commonjs_react_amd_react_default().memo(Tr, isTrPropsEqual));
70449
70513
  ;// CONCATENATED MODULE: ../base/src/table/tbody.tsx
70450
70514
 
70451
70515
 
70452
70516
 
70453
70517
 
70454
70518
  /* harmony default export */ var tbody = (function (props) {
70519
+ var _jssStyle$table, _jssStyle$input, _jssStyle$select, _jssStyle$datePicker, _jssStyle$treeSelect, _jssStyle$switch, _jssStyle$checkbox, _jssStyle$radio, _jssStyle$cascader;
70455
70520
  var _props$columns = props.columns,
70456
70521
  columns = _props$columns === void 0 ? [] : _props$columns,
70457
70522
  _props$currentRowInde = props.currentRowIndex,
@@ -70481,6 +70546,23 @@ var Tr = function Tr(props) {
70481
70546
  var expandCol = props.expandHideCol || columns.find(function (col) {
70482
70547
  return col.type === 'expand' || col.type === 'row-expand';
70483
70548
  });
70549
+
70550
+ // 样式 hook 在 Tbody 统一调用一次再下发给 Tr,
70551
+ // 避免每一行都执行 9 次 react-jss useStyles(每次都带 useLayoutEffect/useEffect),行数多时开销明显
70552
+ var jssStyle = props.jssStyle;
70553
+ var tableClasses = jssStyle === null || jssStyle === void 0 || (_jssStyle$table = jssStyle.table) === null || _jssStyle$table === void 0 ? void 0 : _jssStyle$table.call(jssStyle);
70554
+ var inputWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$input = jssStyle.input) === null || _jssStyle$input === void 0 ? void 0 : _jssStyle$input.call(jssStyle).wrapper;
70555
+ var selectWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$select = jssStyle.select) === null || _jssStyle$select === void 0 ? void 0 : _jssStyle$select.call(jssStyle).wrapper;
70556
+ var datePickerWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$datePicker = jssStyle.datePicker) === null || _jssStyle$datePicker === void 0 ? void 0 : _jssStyle$datePicker.call(jssStyle).wrapper;
70557
+ var treeSelectWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$treeSelect = jssStyle.treeSelect) === null || _jssStyle$treeSelect === void 0 ? void 0 : _jssStyle$treeSelect.call(jssStyle).wrapper;
70558
+ var switchWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$switch = jssStyle.switch) === null || _jssStyle$switch === void 0 ? void 0 : _jssStyle$switch.call(jssStyle).wrapper;
70559
+ var checkboxWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$checkbox = jssStyle.checkbox) === null || _jssStyle$checkbox === void 0 ? void 0 : _jssStyle$checkbox.call(jssStyle).wrapper;
70560
+ var radioWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$radio = jssStyle.radio) === null || _jssStyle$radio === void 0 ? void 0 : _jssStyle$radio.call(jssStyle).wrapper;
70561
+ var cascaderWrapper = jssStyle === null || jssStyle === void 0 || (_jssStyle$cascader = jssStyle.cascader) === null || _jssStyle$cascader === void 0 ? void 0 : _jssStyle$cascader.call(jssStyle).wrapper;
70562
+ // 行点击时用于判断点击目标是否为表单控件(不触发 onRowClick / 行展开)
70563
+ var preventClasses = (0,external_root_React_commonjs2_react_commonjs_react_amd_react_.useMemo)(function () {
70564
+ return [inputWrapper, selectWrapper, datePickerWrapper, treeSelectWrapper, switchWrapper, checkboxWrapper, radioWrapper, cascaderWrapper];
70565
+ }, [inputWrapper, selectWrapper, datePickerWrapper, treeSelectWrapper, switchWrapper, checkboxWrapper, radioWrapper, cascaderWrapper]);
70484
70566
  var renderRow = function renderRow(item, index) {
70485
70567
  var _props$rowEvents;
70486
70568
  var rowIndex = index + currentRowIndex;
@@ -70492,6 +70574,8 @@ var Tr = function Tr(props) {
70492
70574
  columns: columns,
70493
70575
  isScrollX: props.isScrollX,
70494
70576
  jssStyle: props.jssStyle,
70577
+ tableClasses: tableClasses,
70578
+ preventClasses: preventClasses,
70495
70579
  colgroup: props.colgroup,
70496
70580
  rowClassName: props.rowClassName,
70497
70581
  rawData: item,
@@ -70529,6 +70613,7 @@ var Tr = function Tr(props) {
70529
70613
  virtual: props.virtual,
70530
70614
  scrolling: props.scrolling,
70531
70615
  strictRowHeight: props.strictRowHeight,
70616
+ rowMemo: props.rowMemo,
70532
70617
  bodyRowSemClass: props.bodyRowSemClass,
70533
70618
  bodyRowSemStyle: props.bodyRowSemStyle,
70534
70619
  bodyCellSemClass: props.bodyCellSemClass,
@@ -70694,9 +70779,6 @@ var table_excluded = ["data"];
70694
70779
 
70695
70780
  var table_devUseWarning = devUseWarning;
70696
70781
  var table_emptyArr = [];
70697
- var emptyRef = {
70698
- current: null
70699
- };
70700
70782
  function Table(props) {
70701
70783
  var _props$jssStyle, _props$jssStyle$table, _columns$find;
70702
70784
  var _props$verticalAlign = props.verticalAlign,
@@ -70773,13 +70855,6 @@ function Table(props) {
70773
70855
  setScrollAble(isScrollAble);
70774
70856
  }, [virtual]);
70775
70857
 
70776
- // TODO: 没用的tbodyHeight,有空移除了
70777
- // 虚拟列表高度另外计算
70778
- var _useResize = useResize({
70779
- targetRef: virtual ? emptyRef : tbodyRef
70780
- }),
70781
- tbodyHeight = _useResize.height;
70782
-
70783
70858
  // default height
70784
70859
  var defaultHeight = virtual && !props.height && !props.virtualScrollContainer ? '100%' : props.height;
70785
70860
  var selection = use_table_select({
@@ -70797,7 +70872,8 @@ function Table(props) {
70797
70872
  data: props.data,
70798
70873
  virtualColumn: props.virtualColumn,
70799
70874
  scrollRef: scrollRef,
70800
- showCheckbox: typeof props.onRowSelect === 'function'
70875
+ showCheckbox: typeof props.onRowSelect === 'function',
70876
+ reuseEqualColumns: !!props.rowMemo
70801
70877
  }),
70802
70878
  columns = _useTableColumns.columns,
70803
70879
  expandHideCol = _useTableColumns.expandHideCol,
@@ -71095,6 +71171,7 @@ function Table(props) {
71095
71171
  treeCheckAll: props.treeCheckAll,
71096
71172
  onCellClick: props.onCellClick,
71097
71173
  strictRowHeight: props.strictRowHeight,
71174
+ rowMemo: props.rowMemo,
71098
71175
  scrollRef: scrollRef,
71099
71176
  bodyRowSemClass: semClass('bodyRow'),
71100
71177
  bodyRowSemStyle: semStyle('bodyRow'),
@@ -71329,8 +71406,11 @@ function Table(props) {
71329
71406
  flex: 1
71330
71407
  },
71331
71408
  wrapperRef: scrollRef,
71332
- scrollWidth: width || 1,
71333
- scrollHeight: virtual ? virtualInfo.scrollHeight : tbodyHeight,
71409
+ scrollWidth: width || 1
71410
+ // 非虚拟时只有空数据会走到 Scroll,此时 isEmpty 会把 paddingTop 置 0,scrollHeight 不生效;
71411
+ // 原先这里对 tbody 做 useResize 监听,tbody 尺寸变化后会额外触发整表重渲染,已移除
71412
+ ,
71413
+ scrollHeight: virtual ? virtualInfo.scrollHeight : 0,
71334
71414
  onScroll: handleVirtualScroll,
71335
71415
  defaultHeight: context.emptyHeight,
71336
71416
  isScrollY: isScrollY,
@@ -80212,7 +80292,7 @@ var watermark_interface = __webpack_require__(6640);
80212
80292
 
80213
80293
 
80214
80294
  /* harmony default export */ var src_0 = ({
80215
- version: '3.10.3-beta.2'
80295
+ version: '3.10.3-beta.4'
80216
80296
  });
80217
80297
  }();
80218
80298
  /******/ return __webpack_exports__;