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

Removal of objects from nested arrays doesn't work as expected #1171

Open
Oudwins opened this issue Feb 22, 2025 · 7 comments
Open

Removal of objects from nested arrays doesn't work as expected #1171

Oudwins opened this issue Feb 22, 2025 · 7 comments
Labels

Comments

@Oudwins
Copy link

Oudwins commented Feb 22, 2025

Describe the bug

When removing an object from a nested array only the "id" field is removed from the element. This happens both if you use arrayField.removeValue and form.setFieldValue.

Your minimal, reproducible example

https://stackblitz.com/edit/tanstack-form-dbycl9vt?file=src%2Findex.tsx

Steps to reproduce

  1. Head to the stack bliz
  2. Click on any of the rendered codes (except the last one, that one works correctly)
  3. You will see in the console the logs of the data before and after each step. You will also see a react key error and can verify that although the object was removed the log that shows the data after the update shows the object that was removed without a id field

Expected behavior

The object is correctly removed. No key error is triggered. React renders the new list correctly.

How often does this bug happen?

Every time

Screenshots or Videos

tanstack-form-issue.mp4

Platform

  • OS: Linux
  • Browser: chrome, brave

TanStack Form adapter

None

TanStack Form version

^0.43.2

TypeScript version

No response

Additional context

Example is a little chaotic. Monday I can clean it up. But I think the video shows what is happening quite well.

@crutchcorn crutchcorn added the bug label Feb 25, 2025
@Oudwins
Copy link
Author

Oudwins commented Feb 25, 2025

Updated the code to be simpler. Let me know if the issue is clear enough if not I'm happy to polish up the example more

@crutchcorn
Copy link
Member

Yeah, apologies @Oudwins I'm not clear what's happening in this example or what the bug you're suggesting exists is 😅

@Oudwins
Copy link
Author

Oudwins commented Mar 1, 2025

Yeah, apologies @Oudwins I'm not clear what's happening in this example or what the bug you're suggesting exists is 😅

Oh, thats a shame. I can try to make an even more minimal example and explain it further.

But for that it would be very helpful if you could explain a little bit further what you have understood (if any) and what you are confused about specifically.

I know this is hard if you don't understand anything but it's very hard for me to figure out a better explanation if I don't know what is confusing

@MinnDevelopment
Copy link

From what I can tell, the fieldMeta still has a key for one of the fields inside the removed element:

Image

On a subsequent render cycle, it's then re-added to the values:

Image

Changing the key on the div from item.id to itemIndex fixes it (see screenshot below). I assume there is a problem in the state handling on form.Field.

Image

@crutchcorn
Copy link
Member

Oh, in that case; does v0.48.1 solve this issue for removeValue?

@flyingonionman
Copy link

flyingonionman commented Mar 1, 2025

On v0.48.1, remove value gets exactly the same bug

Doing a deep dive right now, but largely the bug is caused by setBy being called twice, once with
setBy called with path: consignments[0].goodsItems
and another with
setBy called with path: consignments[0].goodsItems[2].commodityCode

Trying to understand how key on the div is related.

@flyingonionman
Copy link

Very simple example

I spent all day trying to debug this on 0.48.1 yesterday but 1.0 launched in the middle! and I saw #1199. Sadly it doesn't resolve the issue even with removeValue. I am gonna keep taking a swing at it for now but yes, it has to do with the internal implementation of the useSyncExternalStore hook and how react re-renders the items with same keys.

Still a mystery though; when __notifyDerivedListeners is called ( seemingly correctly ), and eventually scheduleUpdateOnFiber is called inside the hook. A mystery for me

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants