From 9fdc9f338f8488f1bf8e4fcd23a4ec7d0d77fb76 Mon Sep 17 00:00:00 2001 From: avightclav Date: Mon, 9 Jun 2025 11:55:24 +0300 Subject: [PATCH 1/2] fix scroll jump avoiding conditional render --- .../src/components/body/MRT_TableBody.tsx | 8 ++++++-- .../src/components/table/MRT_Table.tsx | 11 +++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/material-react-table/src/components/body/MRT_TableBody.tsx b/packages/material-react-table/src/components/body/MRT_TableBody.tsx index 1f6edae72..3df7d1715 100644 --- a/packages/material-react-table/src/components/body/MRT_TableBody.tsx +++ b/packages/material-react-table/src/components/body/MRT_TableBody.tsx @@ -17,6 +17,7 @@ export interface MRT_TableBodyProps extends TableBodyProps { columnVirtualizer?: MRT_ColumnVirtualizer; table: MRT_TableInstance; + skipMemoization?: boolean } export const MRT_TableBody = ({ @@ -215,7 +216,10 @@ export const MRT_TableBody = ({ ); }; -export const Memo_MRT_TableBody = memo( +export const Memoizable_MRT_TableBody = memo( MRT_TableBody, - (prev, next) => prev.table.options.data === next.table.options.data, + (prev, next) => { + return prev.table.options.data === next.table.options.data + && !next.skipMemoization + }, ) as typeof MRT_TableBody; diff --git a/packages/material-react-table/src/components/table/MRT_Table.tsx b/packages/material-react-table/src/components/table/MRT_Table.tsx index f27896ae7..2116c24c0 100644 --- a/packages/material-react-table/src/components/table/MRT_Table.tsx +++ b/packages/material-react-table/src/components/table/MRT_Table.tsx @@ -4,7 +4,7 @@ import { useMRT_ColumnVirtualizer } from '../../hooks/useMRT_ColumnVirtualizer'; import { type MRT_RowData, type MRT_TableInstance } from '../../types'; import { parseCSSVarId } from '../../utils/style.utils'; import { parseFromValuesOrFunc } from '../../utils/utils'; -import { MRT_TableBody, Memo_MRT_TableBody } from '../body/MRT_TableBody'; +import { Memoizable_MRT_TableBody } from '../body/MRT_TableBody'; import { MRT_TableFooter } from '../footer/MRT_TableFooter'; import { MRT_TableHead } from '../head/MRT_TableHead'; @@ -73,11 +73,10 @@ export const MRT_Table = ({ > {!!Caption && {Caption}} {enableTableHead && } - {memoMode === 'table-body' || columnSizingInfo.isResizingColumn ? ( - - ) : ( - - )} + {enableTableFooter && } ); From 7c0d1981bccf163f6d880134072df53cccce7cb1 Mon Sep 17 00:00:00 2001 From: avightclav Date: Mon, 9 Jun 2025 14:24:13 +0300 Subject: [PATCH 2/2] type composition improved --- .../src/components/body/MRT_TableBody.tsx | 26 +++++++++++-------- .../src/components/table/MRT_Table.tsx | 4 +-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/packages/material-react-table/src/components/body/MRT_TableBody.tsx b/packages/material-react-table/src/components/body/MRT_TableBody.tsx index 3df7d1715..efa014b22 100644 --- a/packages/material-react-table/src/components/body/MRT_TableBody.tsx +++ b/packages/material-react-table/src/components/body/MRT_TableBody.tsx @@ -17,9 +17,10 @@ export interface MRT_TableBodyProps extends TableBodyProps { columnVirtualizer?: MRT_ColumnVirtualizer; table: MRT_TableInstance; - skipMemoization?: boolean } +type MRT_TableBody_WithMemoizationHintsProps = MRT_TableBodyProps & { skipMemoization?: boolean; } + export const MRT_TableBody = ({ columnVirtualizer, table, @@ -135,9 +136,8 @@ export const MRT_TableBody = ({ sx={{ color: 'text.secondary', fontStyle: 'italic', - maxWidth: `min(100vw, ${ - tablePaperRef.current?.clientWidth ?? 360 - }px)`, + maxWidth: `min(100vw, ${tablePaperRef.current?.clientWidth ?? 360 + }px)`, py: '2rem', textAlign: 'center', width: '100%', @@ -216,10 +216,14 @@ export const MRT_TableBody = ({ ); }; -export const Memoizable_MRT_TableBody = memo( - MRT_TableBody, - (prev, next) => { - return prev.table.options.data === next.table.options.data - && !next.skipMemoization - }, -) as typeof MRT_TableBody; +const MRT_TableBody_WithMemoizationHints = (props: MRT_TableBody_WithMemoizationHintsProps) => { + const { skipMemoization, ...rest } = props; + return ; +}; + +export const Memo_MRT_TableBody = memo( + MRT_TableBody_WithMemoizationHints, + (prev, next) => + prev.table.options.data === next.table.options.data && + !next.skipMemoization +) as typeof MRT_TableBody_WithMemoizationHints diff --git a/packages/material-react-table/src/components/table/MRT_Table.tsx b/packages/material-react-table/src/components/table/MRT_Table.tsx index 2116c24c0..40a7279c3 100644 --- a/packages/material-react-table/src/components/table/MRT_Table.tsx +++ b/packages/material-react-table/src/components/table/MRT_Table.tsx @@ -4,7 +4,7 @@ import { useMRT_ColumnVirtualizer } from '../../hooks/useMRT_ColumnVirtualizer'; import { type MRT_RowData, type MRT_TableInstance } from '../../types'; import { parseCSSVarId } from '../../utils/style.utils'; import { parseFromValuesOrFunc } from '../../utils/utils'; -import { Memoizable_MRT_TableBody } from '../body/MRT_TableBody'; +import { Memo_MRT_TableBody } from '../body/MRT_TableBody'; import { MRT_TableFooter } from '../footer/MRT_TableFooter'; import { MRT_TableHead } from '../head/MRT_TableHead'; @@ -73,7 +73,7 @@ export const MRT_Table = ({ > {!!Caption && {Caption}} {enableTableHead && } -