Skip to content

Commit 0cd01d3

Browse files
authored
refactor: Merge context (#920)
* refactor: merge ResizeContext * refactor: merge hover context * refactor: merge sticky context * refactor: merge body context * refactor: merge Expand context * chore: comment
1 parent f94ce30 commit 0cd01d3

12 files changed

+129
-164
lines changed

src/Body/BodyRow.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1+
import { useContext } from '@rc-component/context';
12
import classNames from 'classnames';
23
import * as React from 'react';
34
import Cell from '../Cell';
4-
import BodyContext from '../context/BodyContext';
55
import TableContext from '../context/TableContext';
6-
import { useContext } from '@rc-component/context';
76
import type {
87
ColumnType,
98
CustomizeComponent,
@@ -52,11 +51,9 @@ function BodyRow<RecordType extends { children?: readonly RecordType[] }>(
5251
scopeCellComponent,
5352
childrenColumnName,
5453
} = props;
55-
const { prefixCls, fixedInfoList } = useContext(TableContext, [
56-
'prefixCls',
57-
'fixedInfoList',
58-
]);
5954
const {
55+
prefixCls,
56+
fixedInfoList,
6057
flattenColumns,
6158
expandableType,
6259
expandRowByClick,
@@ -67,7 +64,9 @@ function BodyRow<RecordType extends { children?: readonly RecordType[] }>(
6764
expandIcon,
6865
expandedRowRender,
6966
expandIconColumnIndex,
70-
} = useContext(BodyContext, [
67+
} = useContext(TableContext, [
68+
'prefixCls',
69+
'fixedInfoList',
7170
'flattenColumns',
7271
'expandableType',
7372
'expandRowByClick',

src/Body/ExpandedRow.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
import { useContext } from '@rc-component/context';
12
import * as React from 'react';
23
import Cell from '../Cell';
3-
import ExpandedRowContext from '../context/ExpandedRowContext';
44
import TableContext from '../context/TableContext';
5-
import { useContext } from '@rc-component/context';
65
import type { CustomizeComponent } from '../interface';
76

87
export interface ExpandedRowProps {
@@ -26,10 +25,9 @@ function ExpandedRow({
2625
colSpan,
2726
isEmpty,
2827
}: ExpandedRowProps) {
29-
const scrollbarSize = useContext(TableContext, 'scrollbarSize');
30-
const { fixHeader, fixColumn, componentWidth, horizonScroll } = useContext(
31-
ExpandedRowContext,
32-
['fixHeader', 'fixColumn', 'componentWidth', 'horizonScroll'],
28+
const { scrollbarSize, fixHeader, fixColumn, componentWidth, horizonScroll } = useContext(
29+
TableContext,
30+
['scrollbarSize', 'fixHeader', 'fixColumn', 'componentWidth', 'horizonScroll'],
3331
);
3432

3533
// Cache render node

src/Body/index.tsx

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1+
import { useContext } from '@rc-component/context';
12
import * as React from 'react';
2-
import BodyContext from '../context/BodyContext';
3-
import HoverContext from '../context/HoverContext';
43
import type { PerfRecord } from '../context/PerfContext';
54
import PerfContext from '../context/PerfContext';
6-
import ResizeContext from '../context/ResizeContext';
75
import TableContext from '../context/TableContext';
8-
import { useContext } from '@rc-component/context';
96
import useFlattenRecords from '../hooks/useFlattenRecords';
107
import type { GetComponentProps, GetRowKey, Key } from '../interface';
118
import { getColumnsKey } from '../utils/valueUtil';
@@ -34,12 +31,12 @@ function Body<RecordType>({
3431
emptyNode,
3532
childrenColumnName,
3633
}: BodyProps<RecordType>) {
37-
const onColumnResize = useContext(ResizeContext, 'onColumnResize');
38-
const { prefixCls, getComponent } = useContext(TableContext, [
34+
const { prefixCls, getComponent, onColumnResize, flattenColumns } = useContext(TableContext, [
3935
'prefixCls',
4036
'getComponent',
37+
'onColumnResize',
38+
'flattenColumns',
4139
]);
42-
const flattenColumns = useContext(BodyContext, 'flattenColumns');
4340

4441
const flattenData: { record: RecordType; indent: number; index: number }[] =
4542
useFlattenRecords<RecordType>(data, childrenColumnName, expandedKeys, getRowKey);
@@ -49,15 +46,6 @@ function Body<RecordType>({
4946
renderWithProps: false,
5047
});
5148

52-
// ====================== Hover =======================
53-
const [startRow, setStartRow] = React.useState(-1);
54-
const [endRow, setEndRow] = React.useState(-1);
55-
56-
const onHover = React.useCallback((start: number, end: number) => {
57-
setStartRow(start);
58-
setEndRow(end);
59-
}, []);
60-
6149
// ====================== Render ======================
6250
const bodyNode = React.useMemo(() => {
6351
const WrapperComponent = getComponent(['body', 'wrapper'], 'tbody');
@@ -140,13 +128,7 @@ function Body<RecordType>({
140128
flattenData,
141129
]);
142130

143-
return (
144-
<PerfContext.Provider value={perfRef.current}>
145-
<HoverContext.Provider value={{ startRow, endRow, onHover }}>
146-
{bodyNode}
147-
</HoverContext.Provider>
148-
</PerfContext.Provider>
149-
);
131+
return <PerfContext.Provider value={perfRef.current}>{bodyNode}</PerfContext.Provider>;
150132
}
151133

152134
const MemoBody = React.memo(Body);

src/Cell/index.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@ import { supportRef } from 'rc-util/lib/ref';
55
import getValue from 'rc-util/lib/utils/get';
66
import warning from 'rc-util/lib/warning';
77
import * as React from 'react';
8-
import BodyContext from '../context/BodyContext';
9-
import type { HoverContextProps } from '../context/HoverContext';
10-
import HoverContext from '../context/HoverContext';
118
import PerfContext from '../context/PerfContext';
12-
import StickyContext from '../context/StickyContext';
9+
import type { TableContextProps } from '../context/TableContext';
10+
import TableContext from '../context/TableContext';
1311
import type {
1412
AlignType,
1513
CellEllipsisType,
@@ -44,7 +42,7 @@ function isRefComponent(component: CustomizeComponent) {
4442
}
4543

4644
interface InternalCellProps<RecordType extends DefaultRecordType>
47-
extends Pick<HoverContextProps, 'onHover'> {
45+
extends Pick<TableContextProps, 'onHover'> {
4846
prefixCls?: string;
4947
className?: string;
5048
record?: RecordType;
@@ -89,7 +87,7 @@ interface InternalCellProps<RecordType extends DefaultRecordType>
8987

9088
export type CellProps<RecordType extends DefaultRecordType> = Omit<
9189
InternalCellProps<RecordType>,
92-
keyof HoverContextProps
90+
keyof Omit<TableContextProps, 'prefixCls'>
9391
>;
9492

9593
const getTitleFromCellRenderChildren = ({
@@ -146,8 +144,10 @@ function Cell<RecordType extends DefaultRecordType>(
146144
const cellPrefixCls = `${prefixCls}-cell`;
147145

148146
const perfRecord = React.useContext(PerfContext);
149-
const supportSticky = React.useContext(StickyContext);
150-
const allColumnsFixedLeft = useContext(BodyContext, 'allColumnsFixedLeft');
147+
const { supportSticky, allColumnsFixedLeft } = useContext(TableContext, [
148+
'supportSticky',
149+
'allColumnsFixedLeft',
150+
]);
151151

152152
// ==================== Child Node ====================
153153
const [childNode, legacyCellProps] = React.useMemo<
@@ -347,8 +347,13 @@ const WrappedCell = React.forwardRef((props: CellProps<any>, ref: React.Ref<any>
347347
const mergedColSpan = colSpan ?? cellColSpan;
348348
const mergedRowSpan = rowSpan ?? cellRowSpan;
349349

350-
const { onHover, hovering } = useContext(HoverContext, cxt => {
351-
const isHovering = inHoverRange(index, mergedRowSpan || 1, cxt?.startRow, cxt?.endRow);
350+
const { onHover, hovering } = useContext(TableContext, cxt => {
351+
const isHovering = inHoverRange(
352+
index,
353+
mergedRowSpan || 1,
354+
cxt?.hoverStartRow,
355+
cxt?.hoverEndRow,
356+
);
352357

353358
return {
354359
onHover: cxt?.onHover,

src/Table.tsx

Lines changed: 55 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,6 @@ import * as React from 'react';
3838
import Body from './Body';
3939
import ColGroup from './ColGroup';
4040
import { EXPAND_COLUMN } from './constant';
41-
import BodyContext from './context/BodyContext';
42-
import ExpandedRowContext from './context/ExpandedRowContext';
43-
import ResizeContext from './context/ResizeContext';
44-
import StickyContext from './context/StickyContext';
4541
import TableContext from './context/TableContext';
4642
import FixedHolder from './FixedHolder';
4743
import Footer, { FooterComponents } from './Footer';
@@ -262,6 +258,15 @@ function Table<RecordType extends DefaultRecordType>(tableProps: TableProps<Reco
262258
};
263259
}, [rowKey]);
264260

261+
// ====================== Hover =======================
262+
const [startRow, setStartRow] = React.useState(-1);
263+
const [endRow, setEndRow] = React.useState(-1);
264+
265+
const onHover = React.useCallback((start: number, end: number) => {
266+
setStartRow(start);
267+
setEndRow(end);
268+
}, []);
269+
265270
// ====================== Expand ======================
266271
const expandableConfig = getExpandableProps(props);
267272

@@ -829,6 +834,7 @@ function Table<RecordType extends DefaultRecordType>(tableProps: TableProps<Reco
829834

830835
const TableContextValue = React.useMemo(
831836
() => ({
837+
// Table
832838
prefixCls,
833839
getComponent,
834840
scrollbarSize,
@@ -837,13 +843,15 @@ function Table<RecordType extends DefaultRecordType>(tableProps: TableProps<Reco
837843
getCellFixedInfo(colIndex, colIndex, flattenColumns, stickyOffsets, direction),
838844
),
839845
isSticky,
840-
}),
841-
[prefixCls, getComponent, scrollbarSize, direction, flattenColumns, stickyOffsets, isSticky],
842-
);
846+
supportSticky,
847+
848+
componentWidth,
849+
fixHeader,
850+
fixColumn,
851+
horizonScroll,
852+
853+
// Body
843854

844-
const BodyContextValue = React.useMemo(
845-
() => ({
846-
...columnContext,
847855
tableLayout: mergedTableLayout,
848856
rowClassName,
849857
expandedRowClassName,
@@ -854,10 +862,34 @@ function Table<RecordType extends DefaultRecordType>(tableProps: TableProps<Reco
854862
onTriggerExpand,
855863
expandIconColumnIndex,
856864
indentSize,
857-
allColumnsFixedLeft: columnContext.flattenColumns.every(col => col.fixed === 'left'),
865+
allColumnsFixedLeft: flattenColumns.every(col => col.fixed === 'left'),
866+
867+
// Column
868+
columns,
869+
flattenColumns,
870+
onColumnResize,
871+
872+
// Row
873+
hoverStartRow: startRow,
874+
hoverEndRow: endRow,
875+
onHover,
858876
}),
859877
[
860-
columnContext,
878+
// Table
879+
prefixCls,
880+
getComponent,
881+
scrollbarSize,
882+
direction,
883+
stickyOffsets,
884+
isSticky,
885+
supportSticky,
886+
887+
componentWidth,
888+
fixHeader,
889+
fixColumn,
890+
horizonScroll,
891+
892+
// Body
861893
mergedTableLayout,
862894
rowClassName,
863895
expandedRowClassName,
@@ -868,32 +900,20 @@ function Table<RecordType extends DefaultRecordType>(tableProps: TableProps<Reco
868900
onTriggerExpand,
869901
expandIconColumnIndex,
870902
indentSize,
871-
],
872-
);
873903

874-
const ExpandedRowContextValue = React.useMemo(
875-
() => ({
876-
componentWidth,
877-
fixHeader,
878-
fixColumn,
879-
horizonScroll,
880-
}),
881-
[componentWidth, fixHeader, fixColumn, horizonScroll],
882-
);
904+
// Column
905+
columns,
906+
flattenColumns,
907+
onColumnResize,
883908

884-
const ResizeContextValue = React.useMemo(() => ({ onColumnResize }), [onColumnResize]);
885-
886-
return (
887-
<StickyContext.Provider value={supportSticky}>
888-
<TableContext.Provider value={TableContextValue}>
889-
<BodyContext.Provider value={BodyContextValue}>
890-
<ExpandedRowContext.Provider value={ExpandedRowContextValue}>
891-
<ResizeContext.Provider value={ResizeContextValue}>{fullTable}</ResizeContext.Provider>
892-
</ExpandedRowContext.Provider>
893-
</BodyContext.Provider>
894-
</TableContext.Provider>
895-
</StickyContext.Provider>
909+
// Row
910+
startRow,
911+
endRow,
912+
onHover,
913+
],
896914
);
915+
916+
return <TableContext.Provider value={TableContextValue}>{fullTable}</TableContext.Provider>;
897917
}
898918

899919
const ImmutableTable = makeImmutable(Table);

src/context/BodyContext.tsx

Lines changed: 0 additions & 36 deletions
This file was deleted.

src/context/ExpandedRowContext.tsx

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/context/HoverContext.tsx

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/context/PerfContext.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export interface PerfRecord {
44
renderWithProps: boolean;
55
}
66

7+
// TODO: Remove when use `responsiveImmutable`
78
const PerfContext = React.createContext<PerfRecord>({
89
renderWithProps: false,
910
});

src/context/ResizeContext.tsx

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)