@sheinx/hooks 3.10.2-beta.4 → 3.10.2-beta.5

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.
@@ -5,14 +5,13 @@ export interface UseTableLayoutProps extends Pick<BaseTableProps<any>, 'data' |
5
5
  theadRef: React.RefObject<HTMLElement>;
6
6
  tbodyRef: React.RefObject<HTMLElement>;
7
7
  scrollRef: React.RefObject<HTMLElement>;
8
+ tableElRef?: React.RefObject<HTMLElement>;
8
9
  isRtl?: boolean;
9
10
  scrolling?: boolean;
10
11
  }
11
12
  declare const useTableLayout: (props: UseTableLayoutProps) => {
12
13
  isScrollX: boolean;
13
14
  isScrollY: boolean;
14
- floatLeft: boolean;
15
- floatRight: boolean;
16
15
  scrollBarWidth: number;
17
16
  colgroup: (string | number | undefined)[];
18
17
  func: {
@@ -21,11 +20,13 @@ declare const useTableLayout: (props: UseTableLayoutProps) => {
21
20
  resizeCol: (index: any) => void;
22
21
  dragCol: (index: number, deltaX: number) => void;
23
22
  checkFloat: () => void;
23
+ scheduleCheckFloat: () => void;
24
24
  };
25
25
  width: string | number | undefined;
26
26
  shouldLastColAuto: boolean | undefined;
27
27
  scrollWidth: number;
28
28
  resizeFlag: number;
29
+ registerFloatClass: (left: string, right: string) => void;
29
30
  };
30
31
  export default useTableLayout;
31
32
  //# sourceMappingURL=use-table-layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-table-layout.d.ts","sourceRoot":"","sources":["use-table-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAKlE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0CrE,MAAM,WAAW,mBACf,SAAQ,IAAI,CACV,cAAc,CAAC,GAAG,CAAC,EACnB,MAAM,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,OAAO,CAC7E;IACD,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,UAAW,mBAAmB;;;;;;;;;;;yBAiDX,MAAM,UAAU,MAAM;;;;;;;CAwS5D,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"use-table-layout.d.ts","sourceRoot":"","sources":["use-table-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsD,MAAM,OAAO,CAAC;AAK3E,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0CrE,MAAM,WAAW,mBACf,SAAQ,IAAI,CACV,cAAc,CAAC,GAAG,CAAC,EACnB,MAAM,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,OAAO,CAC7E;IACD,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,UAAW,mBAAmB;;;;;;;;;yBA8DX,MAAM,UAAU,MAAM;;;;;;;;+BA+TZ,MAAM,SAAS,MAAM;CAgBrE,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -72,6 +72,18 @@ var useTableLayout = function useTableLayout(props) {
72
72
  scrollRef = props.scrollRef;
73
73
  var preColumns = (0, _usePrevious.default)(props.columns);
74
74
  var preData = (0, _usePrevious.default)(props.data);
75
+
76
+ // 按需启用 floatLeft/floatRight:只有存在对应方向的固定列时才跟踪状态
77
+ var hasFixedLeft = (0, _react.useMemo)(function () {
78
+ return props.columns.some(function (col) {
79
+ return col.fixed === 'left';
80
+ });
81
+ }, [props.columns]);
82
+ var hasFixedRight = (0, _react.useMemo)(function () {
83
+ return props.columns.some(function (col) {
84
+ return col.fixed === 'right';
85
+ });
86
+ }, [props.columns]);
75
87
  var _useRef = (0, _react.useRef)({
76
88
  checkNum: 0,
77
89
  cachedWidth: null,
@@ -91,36 +103,33 @@ var useTableLayout = function useTableLayout(props) {
91
103
  _React$useState6 = _slicedToArray(_React$useState5, 2),
92
104
  isScrollY = _React$useState6[0],
93
105
  setIsScrollY = _React$useState6[1];
94
- var _React$useState7 = _react.default.useState(false),
106
+ // floatLeft/floatRight 改用 ref 跟踪,通过 DOM classList 直接切换,避免 setState 触发整棵树 re-render
107
+ var floatLeftRef = (0, _react.useRef)(false);
108
+ var floatRightRef = (0, _react.useRef)(false);
109
+ var floatClassRef = (0, _react.useRef)(null);
110
+ var checkFloatRafRef = (0, _react.useRef)(0);
111
+ var _React$useState7 = _react.default.useState(0),
95
112
  _React$useState8 = _slicedToArray(_React$useState7, 2),
96
- floatLeft = _React$useState8[0],
97
- setFloatLeft = _React$useState8[1];
98
- var _React$useState9 = _react.default.useState(false),
113
+ resizeFlag = _React$useState8[0],
114
+ setResizeFlag = _React$useState8[1];
115
+ var _React$useState9 = _react.default.useState(0),
99
116
  _React$useState10 = _slicedToArray(_React$useState9, 2),
100
- floatRight = _React$useState10[0],
101
- setFloatRight = _React$useState10[1];
117
+ scrollBarWidth = _React$useState10[0],
118
+ setScrollBarWidth = _React$useState10[1];
102
119
  var _React$useState11 = _react.default.useState(0),
103
120
  _React$useState12 = _slicedToArray(_React$useState11, 2),
104
- resizeFlag = _React$useState12[0],
105
- setResizeFlag = _React$useState12[1];
106
- var _React$useState13 = _react.default.useState(0),
107
- _React$useState14 = _slicedToArray(_React$useState13, 2),
108
- scrollBarWidth = _React$useState14[0],
109
- setScrollBarWidth = _React$useState14[1];
110
- var _React$useState15 = _react.default.useState(0),
111
- _React$useState16 = _slicedToArray(_React$useState15, 2),
112
- scrollWidth = _React$useState16[0],
113
- setScrollWidth = _React$useState16[1];
114
- var _React$useState17 = _react.default.useState(props.columns.map(function (v) {
121
+ scrollWidth = _React$useState12[0],
122
+ setScrollWidth = _React$useState12[1];
123
+ var _React$useState13 = _react.default.useState(props.columns.map(function (v) {
115
124
  return v.width;
116
125
  })),
117
- _React$useState18 = _slicedToArray(_React$useState17, 2),
118
- colgroup = _React$useState18[0],
119
- setColgroup = _React$useState18[1];
120
- var _React$useState19 = _react.default.useState(true),
121
- _React$useState20 = _slicedToArray(_React$useState19, 2),
122
- adjust = _React$useState20[0],
123
- setAdjust = _React$useState20[1];
126
+ _React$useState14 = _slicedToArray(_React$useState13, 2),
127
+ colgroup = _React$useState14[0],
128
+ setColgroup = _React$useState14[1];
129
+ var _React$useState15 = _react.default.useState(true),
130
+ _React$useState16 = _slicedToArray(_React$useState15, 2),
131
+ adjust = _React$useState16[0],
132
+ setAdjust = _React$useState16[1];
124
133
 
125
134
  // 检查滚动状态
126
135
  var checkScroll = (0, _usePersistFn.default)(function () {
@@ -327,6 +336,7 @@ var useTableLayout = function useTableLayout(props) {
327
336
  changeColGroup(newCols, false);
328
337
  });
329
338
  var checkFloat = (0, _usePersistFn.default)(function () {
339
+ var _props$tableElRef;
330
340
  var scrollEl = scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current;
331
341
  if (!scrollEl || !(scrollEl !== null && scrollEl !== void 0 && scrollEl.offsetParent)) return;
332
342
  var max = scrollEl.scrollWidth - scrollEl.clientWidth;
@@ -335,11 +345,36 @@ var useTableLayout = function useTableLayout(props) {
335
345
  if (props.isRtl) {
336
346
  left = left * -1;
337
347
  }
338
- var l = left > min;
339
- // 缩放比例小于1时, 会出现小数, 导致判断错误
340
- var r = max - left > 1;
341
- if (l !== floatLeft) setFloatLeft(l);
342
- if (r !== floatRight) setFloatRight(r);
348
+
349
+ // 直接操作 DOM classList,不触发 React re-render
350
+ var classes = floatClassRef.current;
351
+ var el = (_props$tableElRef = props.tableElRef) === null || _props$tableElRef === void 0 ? void 0 : _props$tableElRef.current;
352
+ if (!classes || !el) return;
353
+ if (hasFixedLeft) {
354
+ var l = left > min;
355
+ if (l !== floatLeftRef.current) {
356
+ floatLeftRef.current = l;
357
+ el.classList.toggle(classes.left, l);
358
+ }
359
+ }
360
+ if (hasFixedRight) {
361
+ // 缩放比例小于1时,会出现小数,导致判断错误
362
+ var r = max - left > 1;
363
+ if (r !== floatRightRef.current) {
364
+ floatRightRef.current = r;
365
+ el.classList.toggle(classes.right, r);
366
+ }
367
+ }
368
+ });
369
+
370
+ // rAF 节流版:高频滚动路径使用,一帧最多执行一次 checkFloat
371
+ var scheduleCheckFloat = (0, _usePersistFn.default)(function () {
372
+ if (!hasFixedLeft && !hasFixedRight) return;
373
+ if (checkFloatRafRef.current) return;
374
+ checkFloatRafRef.current = requestAnimationFrame(function () {
375
+ checkFloatRafRef.current = 0;
376
+ checkFloat();
377
+ });
343
378
  });
344
379
  var syncScrollWidth = (0, _usePersistFn.default)(function () {
345
380
  if (!scrollRef.current) return;
@@ -362,8 +397,18 @@ var useTableLayout = function useTableLayout(props) {
362
397
  resetColGroup: resetColGroup,
363
398
  resizeCol: resizeCol,
364
399
  dragCol: dragCol,
365
- checkFloat: checkFloat
400
+ checkFloat: checkFloat,
401
+ scheduleCheckFloat: scheduleCheckFloat
366
402
  });
403
+
404
+ // 组件卸载时清理 rAF
405
+ (0, _react.useEffect)(function () {
406
+ return function () {
407
+ if (checkFloatRafRef.current) {
408
+ cancelAnimationFrame(checkFloatRafRef.current);
409
+ }
410
+ };
411
+ }, []);
367
412
  (0, _react.useEffect)(function () {
368
413
  if (!colgroup) return;
369
414
  // columns 增加或者减少列, 或者宽度发生变化且和colgroup的宽度不一致时
@@ -441,18 +486,25 @@ var useTableLayout = function useTableLayout(props) {
441
486
  } else {
442
487
  tableWidth = undefined;
443
488
  }
489
+
490
+ // 注册 float class name,由 table.tsx 初始化时调用
491
+ var registerFloatClass = (0, _usePersistFn.default)(function (left, right) {
492
+ floatClassRef.current = {
493
+ left: left,
494
+ right: right
495
+ };
496
+ });
444
497
  return {
445
498
  isScrollX: !!isScrollX,
446
499
  isScrollY: !!isScrollY,
447
- floatLeft: floatLeft,
448
- floatRight: floatRight,
449
500
  scrollBarWidth: scrollBarWidth,
450
501
  colgroup: colgroup ? colgroup : [],
451
502
  func: func,
452
503
  width: tableWidth,
453
504
  shouldLastColAuto: props.columnResizable && !adjust,
454
505
  scrollWidth: scrollWidth,
455
- resizeFlag: resizeFlag
506
+ resizeFlag: resizeFlag,
507
+ registerFloatClass: registerFloatClass
456
508
  };
457
509
  };
458
510
  var _default = exports.default = useTableLayout;
@@ -5,14 +5,13 @@ export interface UseTableLayoutProps extends Pick<BaseTableProps<any>, 'data' |
5
5
  theadRef: React.RefObject<HTMLElement>;
6
6
  tbodyRef: React.RefObject<HTMLElement>;
7
7
  scrollRef: React.RefObject<HTMLElement>;
8
+ tableElRef?: React.RefObject<HTMLElement>;
8
9
  isRtl?: boolean;
9
10
  scrolling?: boolean;
10
11
  }
11
12
  declare const useTableLayout: (props: UseTableLayoutProps) => {
12
13
  isScrollX: boolean;
13
14
  isScrollY: boolean;
14
- floatLeft: boolean;
15
- floatRight: boolean;
16
15
  scrollBarWidth: number;
17
16
  colgroup: (string | number | undefined)[];
18
17
  func: {
@@ -21,11 +20,13 @@ declare const useTableLayout: (props: UseTableLayoutProps) => {
21
20
  resizeCol: (index: any) => void;
22
21
  dragCol: (index: number, deltaX: number) => void;
23
22
  checkFloat: () => void;
23
+ scheduleCheckFloat: () => void;
24
24
  };
25
25
  width: string | number | undefined;
26
26
  shouldLastColAuto: boolean | undefined;
27
27
  scrollWidth: number;
28
28
  resizeFlag: number;
29
+ registerFloatClass: (left: string, right: string) => void;
29
30
  };
30
31
  export default useTableLayout;
31
32
  //# sourceMappingURL=use-table-layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-table-layout.d.ts","sourceRoot":"","sources":["use-table-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAKlE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0CrE,MAAM,WAAW,mBACf,SAAQ,IAAI,CACV,cAAc,CAAC,GAAG,CAAC,EACnB,MAAM,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,OAAO,CAC7E;IACD,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,UAAW,mBAAmB;;;;;;;;;;;yBAiDX,MAAM,UAAU,MAAM;;;;;;;CAwS5D,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"use-table-layout.d.ts","sourceRoot":"","sources":["use-table-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsD,MAAM,OAAO,CAAC;AAK3E,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA0CrE,MAAM,WAAW,mBACf,SAAQ,IAAI,CACV,cAAc,CAAC,GAAG,CAAC,EACnB,MAAM,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,OAAO,CAC7E;IACD,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAClC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,UAAW,mBAAmB;;;;;;;;;yBA8DX,MAAM,UAAU,MAAM;;;;;;;;+BA+TZ,MAAM,SAAS,MAAM;CAgBrE,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -14,7 +14,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
14
14
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
15
15
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
16
16
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
17
- import React, { useEffect, useRef, useLayoutEffect } from 'react';
17
+ import React, { useEffect, useMemo, useRef, useLayoutEffect } from 'react';
18
18
  import useLatestObj from "../../common/use-latest-obj";
19
19
  import usePersistFn from "../../common/use-persist-fn";
20
20
  import usePrevious from "../../common/use-previous";
@@ -63,6 +63,18 @@ var useTableLayout = function useTableLayout(props) {
63
63
  scrollRef = props.scrollRef;
64
64
  var preColumns = usePrevious(props.columns);
65
65
  var preData = usePrevious(props.data);
66
+
67
+ // 按需启用 floatLeft/floatRight:只有存在对应方向的固定列时才跟踪状态
68
+ var hasFixedLeft = useMemo(function () {
69
+ return props.columns.some(function (col) {
70
+ return col.fixed === 'left';
71
+ });
72
+ }, [props.columns]);
73
+ var hasFixedRight = useMemo(function () {
74
+ return props.columns.some(function (col) {
75
+ return col.fixed === 'right';
76
+ });
77
+ }, [props.columns]);
66
78
  var _useRef = useRef({
67
79
  checkNum: 0,
68
80
  cachedWidth: null,
@@ -82,36 +94,33 @@ var useTableLayout = function useTableLayout(props) {
82
94
  _React$useState6 = _slicedToArray(_React$useState5, 2),
83
95
  isScrollY = _React$useState6[0],
84
96
  setIsScrollY = _React$useState6[1];
85
- var _React$useState7 = React.useState(false),
97
+ // floatLeft/floatRight 改用 ref 跟踪,通过 DOM classList 直接切换,避免 setState 触发整棵树 re-render
98
+ var floatLeftRef = useRef(false);
99
+ var floatRightRef = useRef(false);
100
+ var floatClassRef = useRef(null);
101
+ var checkFloatRafRef = useRef(0);
102
+ var _React$useState7 = React.useState(0),
86
103
  _React$useState8 = _slicedToArray(_React$useState7, 2),
87
- floatLeft = _React$useState8[0],
88
- setFloatLeft = _React$useState8[1];
89
- var _React$useState9 = React.useState(false),
104
+ resizeFlag = _React$useState8[0],
105
+ setResizeFlag = _React$useState8[1];
106
+ var _React$useState9 = React.useState(0),
90
107
  _React$useState10 = _slicedToArray(_React$useState9, 2),
91
- floatRight = _React$useState10[0],
92
- setFloatRight = _React$useState10[1];
108
+ scrollBarWidth = _React$useState10[0],
109
+ setScrollBarWidth = _React$useState10[1];
93
110
  var _React$useState11 = React.useState(0),
94
111
  _React$useState12 = _slicedToArray(_React$useState11, 2),
95
- resizeFlag = _React$useState12[0],
96
- setResizeFlag = _React$useState12[1];
97
- var _React$useState13 = React.useState(0),
98
- _React$useState14 = _slicedToArray(_React$useState13, 2),
99
- scrollBarWidth = _React$useState14[0],
100
- setScrollBarWidth = _React$useState14[1];
101
- var _React$useState15 = React.useState(0),
102
- _React$useState16 = _slicedToArray(_React$useState15, 2),
103
- scrollWidth = _React$useState16[0],
104
- setScrollWidth = _React$useState16[1];
105
- var _React$useState17 = React.useState(props.columns.map(function (v) {
112
+ scrollWidth = _React$useState12[0],
113
+ setScrollWidth = _React$useState12[1];
114
+ var _React$useState13 = React.useState(props.columns.map(function (v) {
106
115
  return v.width;
107
116
  })),
108
- _React$useState18 = _slicedToArray(_React$useState17, 2),
109
- colgroup = _React$useState18[0],
110
- setColgroup = _React$useState18[1];
111
- var _React$useState19 = React.useState(true),
112
- _React$useState20 = _slicedToArray(_React$useState19, 2),
113
- adjust = _React$useState20[0],
114
- setAdjust = _React$useState20[1];
117
+ _React$useState14 = _slicedToArray(_React$useState13, 2),
118
+ colgroup = _React$useState14[0],
119
+ setColgroup = _React$useState14[1];
120
+ var _React$useState15 = React.useState(true),
121
+ _React$useState16 = _slicedToArray(_React$useState15, 2),
122
+ adjust = _React$useState16[0],
123
+ setAdjust = _React$useState16[1];
115
124
 
116
125
  // 检查滚动状态
117
126
  var checkScroll = usePersistFn(function () {
@@ -318,6 +327,7 @@ var useTableLayout = function useTableLayout(props) {
318
327
  changeColGroup(newCols, false);
319
328
  });
320
329
  var checkFloat = usePersistFn(function () {
330
+ var _props$tableElRef;
321
331
  var scrollEl = scrollRef === null || scrollRef === void 0 ? void 0 : scrollRef.current;
322
332
  if (!scrollEl || !(scrollEl !== null && scrollEl !== void 0 && scrollEl.offsetParent)) return;
323
333
  var max = scrollEl.scrollWidth - scrollEl.clientWidth;
@@ -326,11 +336,36 @@ var useTableLayout = function useTableLayout(props) {
326
336
  if (props.isRtl) {
327
337
  left = left * -1;
328
338
  }
329
- var l = left > min;
330
- // 缩放比例小于1时, 会出现小数, 导致判断错误
331
- var r = max - left > 1;
332
- if (l !== floatLeft) setFloatLeft(l);
333
- if (r !== floatRight) setFloatRight(r);
339
+
340
+ // 直接操作 DOM classList,不触发 React re-render
341
+ var classes = floatClassRef.current;
342
+ var el = (_props$tableElRef = props.tableElRef) === null || _props$tableElRef === void 0 ? void 0 : _props$tableElRef.current;
343
+ if (!classes || !el) return;
344
+ if (hasFixedLeft) {
345
+ var l = left > min;
346
+ if (l !== floatLeftRef.current) {
347
+ floatLeftRef.current = l;
348
+ el.classList.toggle(classes.left, l);
349
+ }
350
+ }
351
+ if (hasFixedRight) {
352
+ // 缩放比例小于1时,会出现小数,导致判断错误
353
+ var r = max - left > 1;
354
+ if (r !== floatRightRef.current) {
355
+ floatRightRef.current = r;
356
+ el.classList.toggle(classes.right, r);
357
+ }
358
+ }
359
+ });
360
+
361
+ // rAF 节流版:高频滚动路径使用,一帧最多执行一次 checkFloat
362
+ var scheduleCheckFloat = usePersistFn(function () {
363
+ if (!hasFixedLeft && !hasFixedRight) return;
364
+ if (checkFloatRafRef.current) return;
365
+ checkFloatRafRef.current = requestAnimationFrame(function () {
366
+ checkFloatRafRef.current = 0;
367
+ checkFloat();
368
+ });
334
369
  });
335
370
  var syncScrollWidth = usePersistFn(function () {
336
371
  if (!scrollRef.current) return;
@@ -353,8 +388,18 @@ var useTableLayout = function useTableLayout(props) {
353
388
  resetColGroup: resetColGroup,
354
389
  resizeCol: resizeCol,
355
390
  dragCol: dragCol,
356
- checkFloat: checkFloat
391
+ checkFloat: checkFloat,
392
+ scheduleCheckFloat: scheduleCheckFloat
357
393
  });
394
+
395
+ // 组件卸载时清理 rAF
396
+ useEffect(function () {
397
+ return function () {
398
+ if (checkFloatRafRef.current) {
399
+ cancelAnimationFrame(checkFloatRafRef.current);
400
+ }
401
+ };
402
+ }, []);
358
403
  useEffect(function () {
359
404
  if (!colgroup) return;
360
405
  // columns 增加或者减少列, 或者宽度发生变化且和colgroup的宽度不一致时
@@ -432,18 +477,25 @@ var useTableLayout = function useTableLayout(props) {
432
477
  } else {
433
478
  tableWidth = undefined;
434
479
  }
480
+
481
+ // 注册 float class name,由 table.tsx 初始化时调用
482
+ var registerFloatClass = usePersistFn(function (left, right) {
483
+ floatClassRef.current = {
484
+ left: left,
485
+ right: right
486
+ };
487
+ });
435
488
  return {
436
489
  isScrollX: !!isScrollX,
437
490
  isScrollY: !!isScrollY,
438
- floatLeft: floatLeft,
439
- floatRight: floatRight,
440
491
  scrollBarWidth: scrollBarWidth,
441
492
  colgroup: colgroup ? colgroup : [],
442
493
  func: func,
443
494
  width: tableWidth,
444
495
  shouldLastColAuto: props.columnResizable && !adjust,
445
496
  scrollWidth: scrollWidth,
446
- resizeFlag: resizeFlag
497
+ resizeFlag: resizeFlag,
498
+ registerFloatClass: registerFloatClass
447
499
  };
448
500
  };
449
501
  export default useTableLayout;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sheinx/hooks",
3
- "version": "3.10.2-beta.4",
3
+ "version": "3.10.2-beta.5",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "license": "MIT",