@sheinx/hooks 3.10.2-beta.3 → 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.
- package/cjs/components/use-table/use-table-layout.d.ts +3 -2
- package/cjs/components/use-table/use-table-layout.d.ts.map +1 -1
- package/cjs/components/use-table/use-table-layout.js +85 -33
- package/esm/components/use-table/use-table-layout.d.ts +3 -2
- package/esm/components/use-table/use-table-layout.d.ts.map +1 -1
- package/esm/components/use-table/use-table-layout.js +86 -34
- package/package.json +1 -1
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
var _React$useState9 = _react.default.useState(
|
|
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
|
-
|
|
101
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
var _React$useState13 = _react.default.useState(
|
|
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$
|
|
118
|
-
colgroup = _React$
|
|
119
|
-
setColgroup = _React$
|
|
120
|
-
var _React$
|
|
121
|
-
_React$
|
|
122
|
-
adjust = _React$
|
|
123
|
-
setAdjust = _React$
|
|
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
|
-
|
|
339
|
-
//
|
|
340
|
-
var
|
|
341
|
-
|
|
342
|
-
if (
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
var _React$useState9 = React.useState(
|
|
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
|
-
|
|
92
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
var _React$useState13 = React.useState(
|
|
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$
|
|
109
|
-
colgroup = _React$
|
|
110
|
-
setColgroup = _React$
|
|
111
|
-
var _React$
|
|
112
|
-
_React$
|
|
113
|
-
adjust = _React$
|
|
114
|
-
setAdjust = _React$
|
|
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
|
-
|
|
330
|
-
//
|
|
331
|
-
var
|
|
332
|
-
|
|
333
|
-
if (
|
|
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;
|