Skip to content

Commit 2d55eff

Browse files
authored
feat: shouldCellUpdate return prev value (#493)
1 parent 2722bac commit 2d55eff

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

src/Cell/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export interface CellProps<RecordType extends DefaultRecordType> {
4242
ellipsis?: CellEllipsisType;
4343
align?: AlignType;
4444

45-
shouldCellUpdate?: (record: RecordType) => boolean;
45+
shouldCellUpdate?: (record: RecordType, prevRecord: RecordType) => boolean;
4646

4747
// Fixed
4848
fixLeft?: number | false;
@@ -207,9 +207,9 @@ function Cell<RecordType extends DefaultRecordType>(
207207
const RefCell = React.forwardRef<any, CellProps<any>>(Cell);
208208
RefCell.displayName = 'Cell';
209209

210-
const MemoCell = React.memo(RefCell, (_, next: CellProps<any>) => {
210+
const MemoCell = React.memo(RefCell, (prev: CellProps<any>, next: CellProps<any>) => {
211211
if (next.shouldCellUpdate) {
212-
return !next.shouldCellUpdate(next.record);
212+
return !next.shouldCellUpdate(next.record, prev.record);
213213
}
214214

215215
return false;

src/interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export interface ColumnType<RecordType> extends ColumnSharedType<RecordType> {
8181
record: RecordType,
8282
index: number,
8383
) => React.ReactNode | RenderedCell<RecordType>;
84-
shouldCellUpdate?: (record: RecordType) => boolean;
84+
shouldCellUpdate?: (record: RecordType, prevRecord: RecordType) => boolean;
8585
rowSpan?: number;
8686
width?: number | string;
8787
onCell?: GetComponentProps<RecordType>;

tests/Table.spec.js

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -965,18 +965,24 @@ describe('Table.Basic', () => {
965965
const record = { key: 1 };
966966
let shouldUpdate = false;
967967
let renderTimes = 0;
968+
let prev;
969+
let next;
968970

969-
const Demo = () => {
971+
const Demo = ({ records }) => {
970972
const [, forceUpdate] = React.useState({});
971973

972974
return (
973975
<>
974976
<Table
975-
data={[record]}
977+
data={records}
976978
columns={[
977979
{
978980
dataIndex: 'key',
979-
shouldCellUpdate: () => shouldUpdate,
981+
shouldCellUpdate: (nextRecord, prevRecord) => {
982+
next = nextRecord;
983+
prev = prevRecord;
984+
return shouldUpdate;
985+
},
980986
render() {
981987
renderTimes += 1;
982988
return null;
@@ -994,7 +1000,7 @@ describe('Table.Basic', () => {
9941000
);
9951001
};
9961002

997-
const wrapper = mount(<Demo />);
1003+
const wrapper = mount(<Demo records={[record]} />);
9981004
renderTimes = 0;
9991005

10001006
wrapper.find('button').simulate('click');
@@ -1003,5 +1009,12 @@ describe('Table.Basic', () => {
10031009
shouldUpdate = true;
10041010
wrapper.find('button').simulate('click');
10051011
expect(renderTimes).toEqual(1);
1012+
1013+
// Should update match prev & next
1014+
const newRecord = { ...record, next: true };
1015+
wrapper.setProps({ records: [newRecord] });
1016+
// wrapper.update();
1017+
expect(prev).toBe(record);
1018+
expect(next).toBe(newRecord);
10061019
});
10071020
});

0 commit comments

Comments
 (0)