emotion
emotion copied to clipboard
Given Emotion's `Global` component is used in a component that is lazy loaded and wrapped in `Suspense`, and the parent component is rendered upon initial page load, the global styles are not removed when that component is unmounted
Current behavior:
Given Emotion's Global
component is used in a component that is lazy loaded and wrapped in Suspense
, and the parent component is rendered upon initial page load, the global styles are not removed when that component is unmounted.
Note that when Global
is not in a component that is rendered on initial page load (while wrapped in Suspense
), global styles are correctly removed when the parent component is unmounted.
Seps to reproduce:
Failing Test Case
Using this example: https://stackblitz.com/edit/react-ts-agivwh?file=App.tsx
- Page initially loads
Page1
component - Notice red body background
- Click on the link "CLICK ME TO PAGE 2"
- Page 2 is now rendered
-
Expected Result
- Body should be white
-
Actual Result
- Body is still red
- Body is still red
-
Expected Result
- Click on the link "CLICK ME TO PAGE 1"
- Page 1 is now rendered
-
Expected Result
- Body has 1 red style entry
-
Actual Result
- Body has 2 red style entries (because the original one was never removed)
- Body has 2 red style entries (because the original one was never removed)
-
Expected Result
Passing Test Case
Using the same example at https://stackblitz.com/edit/react-ts-agivwh
- In
App.tsx
, set the initial value ofcurrentPage
to the value of/page2
, then reload web view - Page initially loads
Page2
component - Notice the white background
- Click on the link "CLICK ME TO PAGE 1"
- Page 1 in now rendered
- Notice the red background
- Click on the link "CLICK ME TO PAGE 2"
- Page 2 is loaded
- Notice the white background
Global body style was correctly added and removed.
I tested this in an example without using suspense and everything works as expected following the same steps above
https://stackblitz.com/edit/react-ts-xwa9w5?file=App.tsx
I think that this is actually a React issue, you can find the tracking ticket here. I'm not sure if as such it's worth fixing it in Emotion - especially since there is actually no clear way of dealing with this situation. I guess that we could track disconnecting/reapparing of those components through a combination of useInsertionEffect
+useLayoutEffect
... but that's an ugly workaround 😬 I could consider accepting a PR with such a fix though.
Just ran into this, and came to the same conclusion as suggested by @Andarist
I could see creating a flag to bypass this, possibly, but yeah, it's ugly.
Any chance you just use useLayoutEffect (or an isomorphic variant to support SSR) instead?
I'm also getting this a lot recently after I start using suspense.