Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DataTable: seems to re-render all the rows on select all, even with the pagination. #2979

Open
tmmschmit opened this issue Jun 9, 2022 · 10 comments
Assignees
Labels
Type: Performance Issue is performance or optimization related
Milestone

Comments

@tmmschmit
Copy link

Describe the bug

Hi, so I'm trying to implement a bulk edit on a DataTable with a large amount of entries. But the more entries the table contains, the more slower it is to display the select rows.
I did some tests with a lazy loading and it's much quicker without taking care of the entries number. But this way I lose the sorting and ordering feature of DataTable.

So is there a way to only re-render the visible rows of a DataTable with pagination?

Thanks!

Reproducer

https://codesandbox.io/s/primereact-test-forked-vqhyjv?file=/src/index.js

PrimeReact version

8.1.1

React version

18.x

Language

ALL

Build / Runtime

Create React App (CRA)

Browser(s)

FireFox 101, Chromium 102

Steps to reproduce the behavior

  1. Open the link
  2. Click on the checkbox in the header
  3. change the ENTRY_MULTIPLIER value to see the render speed change.

Expected behavior

Render only the visible rows of the DataTable when the checkbox in the header is clicked.

@tmmschmit tmmschmit added Status: Needs Triage Issue will be reviewed by Core Team and a relevant label will be added as soon as possible Type: Bug Issue contains a defect related to a specific component. labels Jun 9, 2022
@tmmschmit tmmschmit changed the title The DataTable seems to re-render all the rows on select all, even with the pagination. DataTable: seems to re-render all the rows on select all, even with the pagination. Jun 9, 2022
@devken-net
Copy link

I got the same performance issue. It seems DataTable re-render all rows and cells every time non-value props (size, showGridlines, resizableColumns, scrollable, etc) were updated.

@mertsincan mertsincan removed the Status: Needs Triage Issue will be reviewed by Core Team and a relevant label will be added as soon as possible label Aug 25, 2022
@melloware melloware added Type: Performance Issue is performance or optimization related and removed Type: Bug Issue contains a defect related to a specific component. labels Dec 23, 2022
@VeladzicKAG
Copy link

Same issue here. Tried it already with the v10.0.0. Here is the reproducer:

https://codesandbox.io/s/primereact-test-forked-hw8rwr?file=/src/index.js
the issue has already been described here in the discussion: https://github.com/orgs/primefaces/discussions/114

@melloware melloware added this to the Future milestone Oct 6, 2023
@torshid
Copy link

torshid commented Oct 27, 2023

I got the same performance issue. It seems DataTable re-render all rows and cells every time non-value props (size, showGridlines, resizableColumns, scrollable, etc) were updated.

You are right. I have 50 rows in my datatable, even a single selection causes the datatable to re-render everything, as it is also the case when changing a field of a single row (when value mutates). A bit disappointed on this one. :(

image

@mdimitrov94
Copy link

Any news on this? I see a lot of bugs being fixed but not this one. :(

@melloware
Copy link
Member

@mdimitrov94 if you need immediate support I suggest looking into PrimeReact PRO support.

@sja-cslab
Copy link
Contributor

Additional Info:
Same in PrimeReact 10.6.6 but more than that - whenever the parent re-renders, even if you wrap datatable and columns to make them memoized, the table will re-render

@minhnguyenduy99
Copy link

I got the same problem. Is anyone working on to fix this bug ?

@accioly-cassio
Copy link

I'm having the same issue here, just tested with the version 10.8.4. Has anyone found a workaround until the issue is fixed?

@djg3577
Copy link

djg3577 commented Nov 12, 2024

Dealing with the same issue on 10.8.4 as well

@accioly-cassio
Copy link

accioly-cassio commented Nov 13, 2024

I have been able to solve the issue by providing meaningful changes to be checked in the BodyCell props before re-rendering it. See the changes below:

export const BodyCell = React.memo((props) => {
    ...
    // BodyCell component code
    ...
}, (prevProps, nextProps) => {
    const hasRowDataChanged = !isEqual(prevProps.rowData, nextProps.rowData);
    const hasEditingStateChanged = prevProps.editing !== nextProps.editing;
    const hasSelectionChanged = prevProps.selected !== nextProps.selected;
    const hasRowOrCellIndexChanged = prevProps.rowIndex !== nextProps.rowIndex || prevProps.index !== nextProps.index;
    const hasExpandedChanged = prevProps.expanded !== nextProps.expanded;
    const hasAllowSelectionChanged = prevProps.allowCellSelection !== nextProps.allowCellSelection || prevProps.allowRowSelection !== nextProps.allowRowSelection;
    const hasEditModeChanged = prevProps.editMode !== nextProps.editMode;
    const hasEditingMetaChanged = !isEqual(prevProps.editingMeta, nextProps.editingMeta);

    return !(
        hasRowDataChanged ||
        hasEditingStateChanged ||
        hasSelectionChanged ||
        hasRowOrCellIndexChanged ||
        hasExpandedChanged ||
        hasAllowSelectionChanged ||
        hasEditModeChanged ||
        hasEditingMetaChanged
    );
});

There might be other meaningful changes in the props which I have missed. But with the implementation, all basic changes to the datatable trigger the necessary re-render and the unnecessary ones, as in the reported issue, are avoided.

For a full implementation, you can refer to my forked primereact repo: https://github.com/accioly-cassio/custom-primereact

@melloware, could the adjustments be checked and included in one of the next versions of primereact?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Type: Performance Issue is performance or optimization related
Projects
None yet
Development

No branches or pull requests