From 5eb38ce98e6413e6f58e84690d8d7fe4f77985cb Mon Sep 17 00:00:00 2001 From: Ben Wittenberg Date: Tue, 4 Jun 2024 19:13:26 +0000 Subject: [PATCH] chore: spike - improve performance with early return --- packages/react/src/DataTable/DataTable.tsx | 6 +++- .../DataTable/__tests__/DataTable.test.tsx | 28 ++++++++++++++++++- packages/react/src/DataTable/useTable.ts | 9 ++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/packages/react/src/DataTable/DataTable.tsx b/packages/react/src/DataTable/DataTable.tsx index e2d59e171a9..7f89c545fb9 100644 --- a/packages/react/src/DataTable/DataTable.tsx +++ b/packages/react/src/DataTable/DataTable.tsx @@ -61,13 +61,17 @@ function DataTable({ initialSortColumn, initialSortDirection, }: DataTableProps) { - const {headers, rows, actions, gridTemplateColumns} = useTable({ + const {headers, rows, actions, gridTemplateColumns, willReactThrowOutRenderResult} = useTable({ data, columns, initialSortColumn, initialSortDirection, }) + if (willReactThrowOutRenderResult) { + return null + } + return ( { }) }) }) + + describe('performance tests', () => { + it('should not render twice on initial render', () => { + type Data = {id: string; value: string} + const columns: ComponentProps>['columns'] = [ + { + header: 'Value', + field: 'value', + }, + ] + const data: ComponentProps>['data'] = [ + { + id: '1', + value: 'one', + }, + ] + let renderCount = 0 + render( + renderCount++}> + + , + ) + + expect(renderCount).toBe(1) + }) + }) }) diff --git a/packages/react/src/DataTable/useTable.ts b/packages/react/src/DataTable/useTable.ts index d046f736e88..a85d73897d2 100644 --- a/packages/react/src/DataTable/useTable.ts +++ b/packages/react/src/DataTable/useTable.ts @@ -47,7 +47,7 @@ export function useTable({ data, initialSortColumn, initialSortDirection, -}: TableConfig): Table { +}: TableConfig): Table & {willReactThrowOutRenderResult: boolean} { const [rowOrder, setRowOrder] = useState(data) const [prevData, setPrevData] = useState(null) const [prevColumns, setPrevColumns] = useState(columns) @@ -58,7 +58,8 @@ export function useTable({ // Reset the `sortByColumn` state if the columns change and that column is no // longer provided - if (columns !== prevColumns) { + const haveColumnsChanged = columns !== prevColumns + if (haveColumnsChanged) { setPrevColumns(columns) if (sortByColumn) { const column = columns.find(column => { @@ -94,7 +95,8 @@ export function useTable({ }) // Update the row order and apply the current sort column to the incoming data - if (data !== prevData) { + const hasDataChanged = data !== prevData + if (hasDataChanged) { setPrevData(data) setRowOrder(data) if (sortByColumn) { @@ -207,6 +209,7 @@ export function useTable({ sortBy, }, gridTemplateColumns, + willReactThrowOutRenderResult: hasDataChanged || haveColumnsChanged, } }