Summary
The reproduction is using Relay, but I came as this seems closer to a bug in React than Relay.
https://stackblitz.com/@cometkim/collections/react-relay-suspend-loop
With this basic setup, using useLazyLoadQuery with network-only to make a new fetch() call on render. The code works fine in v18, but after upgrading to v19, it starts remounting an element infinitely.
- React v18: No issues
- React v19: No differences, but the children including the suspense boundary is unexpectedly unmounted, resulting in an infinite refetch loop.
- React v19 workaround 1: Removing
<StrictMode> seems to solve the issue.
- React v19 workaround 2: Wrap the parent (which is just a context provider with nothing special) by one more
<Suspense> boundary. It seems to do not make sense, but it works.
The expected behavior is that the <Suspense> boundary is retained stable, and the <NetworkOnly> is rendered after waiting for the QueryResource fulfilled.
However, this seems to me like the <Suspense> could suspend itself.
Summary
The reproduction is using Relay, but I came as this seems closer to a bug in React than Relay.
https://stackblitz.com/@cometkim/collections/react-relay-suspend-loop
With this basic setup, using
useLazyLoadQuerywithnetwork-onlyto make a newfetch()call on render. The code works fine in v18, but after upgrading to v19, it starts remounting an element infinitely.<StrictMode>seems to solve the issue.<Suspense>boundary. It seems to do not make sense, but it works.The expected behavior is that the
<Suspense>boundary is retained stable, and the<NetworkOnly>is rendered after waiting for the QueryResource fulfilled.However, this seems to me like the
<Suspense>could suspend itself.