3

I'm rendering a number of items, where each individual item uses the same component:

A single component using Suspense

This component internally uses Suspense:

<Suspense fallback={<Spinner />}>{children}</Suspense>

Whenever I click the paginator, a new set of items is rendered. Each of the items uses the same "Suspensed" component.

Problem: Each of the instances shows a fallback (spinner, loader) for a moment, and only then its content.

Since the fallback has constant height, this changes the height of the parent container, which makes the whole page jumping around:

enter image description here

I'm wondering how could I fix this? Basically, I'd like to avoid the new set of items to collapse due to showing the fallback. Sure, showing the fallback on initial load is fine, but I don't think the already loaded component (dynamically imported code) should show it on consequent pages.

I tried using React.startTransition, but that didn't help.

I also checked with components which are not lazily loaded, and everything works fine (parent height remains constant).

Thanks for help!


Update: I came up with a "poor man's fix":

  1. wrapping children inside 2 divs
  2. ResizeObserver monitoring the height of the inner div and setting the same height to the outer one, but in debounced fashion (100ms later)

Resources:

Note: You'll probably need to mock ResizeObserver in your Jest tests: https://github.com/que-etc/resize-observer-polyfill/issues/50#issuecomment-488064120

Danko Kozar
  • 221
  • 2
  • 8

0 Answers0