In a nutshell, you can't. The issue is that, when you delete an item, the same component that was used previously for it will be used to render the item after it (so if you delete the 2nd item, the 3rd item will use the Row
from the old 2nd element). It will maintain that item's state. If you add a useEffect
to detect that the item changed, then you break everything after it (since everything is bumped up one, all of the items after the deleted item will reset their state. You don't have access to the sibling component's state, so you have no way to propagate the state.
You have a few options here:
- Add the selection to the properties of the item, and provide a way to update the item.
- Make the selection state part of the
App
component's state, and pass it down to the component so it can render appropriately.
I'll also add that you probably don't want to map over your presumably large list of items every render like you are now. It looks like you are doing this to expose deleteItems
. I would recommend something more like this:
<FixedSizeList
height={500}
width={300}
itemCount={items.length}
itemSize={50}
itemData={{items, deleteItem}}
>
{Row}
</FixedSizeList>
Then your Row
component's data
will have both the items
array and the deleteItem
function. If you maintain your selected rows state in App
, you easily extend this to pass the selected state and modification functions down to your Row
component.