You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When using a mutation for deleting an item from a list with an optimistic response, the implementation causes reference changes for all items following the deleted one. This leads to unnecessary re-renders of components that receive these items as props, even if they use React.memo.
The issue seems to stem from how the list is updated optimistically (filter function creates a new array, causing reference changes for all remaining items).
Observe that TodoItem components rerender even when their data does not change (e.g., via console logs in React.memo-wrapped components).
Delete a todo item using the delete button.
Note that all TodoItem components after the deleted one re-render.
Expected behavior
When deleting a todo item and updating the list optimistically:
Only the removed item's reference should change.
Other items should retain their references to prevent unnecessary re-renders.
How often does this bug happen?
Every time
Screenshots or Videos
No response
Platform
any
Tanstack Query adapter
react-query
TanStack Query version
v5.62.0
TypeScript version
v5.2.2
Additional context
The issue is due to how the filter function creates a new array and changes references for all subsequent items. This behavior can negatively impact performance in scenarios with a large number of items or deeply nested component trees.
The text was updated successfully, but these errors were encountered:
when you change an array or object, we try to keep as many references as possible with our structuralSharing feature.
That means if you toggle one todo, even though the list is new and even if you’d provide a new copy of each element, only the changed one would re-render.
If you delete one item from the list, all other items after that would “compare” with a different item, and we therefor can’t keep the reference.
I wouldn’t know how to implement that, I don’t think it’s possible - or do you have an idea?
@TkDodo thanks for the response. So I have two options? Mutate object or use structuralSharing: false? Or is there another way to approach deleting items from the array without changing the reference of the following items?
Describe the bug
When using a mutation for deleting an item from a list with an optimistic response, the implementation causes reference changes for all items following the deleted one. This leads to unnecessary re-renders of components that receive these items as props, even if they use
React.memo
.The issue seems to stem from how the list is updated optimistically (
filter
function creates a new array, causing reference changes for all remaining items).Your minimal, reproducible example
https://stackblitz.com/edit/sb1-tgynyr?file=components%2Ftodo-list.tsx
Steps to reproduce
Expected behavior
When deleting a todo item and updating the list optimistically:
How often does this bug happen?
Every time
Screenshots or Videos
No response
Platform
any
Tanstack Query adapter
react-query
TanStack Query version
v5.62.0
TypeScript version
v5.2.2
Additional context
The issue is due to how the filter function creates a new array and changes references for all subsequent items. This behavior can negatively impact performance in scenarios with a large number of items or deeply nested component trees.
The text was updated successfully, but these errors were encountered: