Maybe not React itself, but the ecosystem as a whole. I can list some of these changes that generated a lot of work from memory:
- the move from in-browser JSX compilation to build tools / webpack
- the move from class components to functional components and hooks
- all the changes related to ES6 classes and modules + build system
- server-side components
- Flux -> Redux
- Redux -> MobX -> Relay -> Redux Toolkit -> Context API -> Zustand / Jotai / Recoil -> react-query (next: zero?)
- Next.js and Remix, 7 react-router versions (latest with major breaking API changes again)
- Signals and more SSR stuff (I stopped looking at this point)
And this is ignoring all the React Native churn over the years as I imagine not everyone is involved with that.
Even if your particular project didn’t go through all of these migrations, you had to relearn things to be able to work in other/newer projects.
It’s impossible to measure, but having written and used a ton of different frameworks, I really do feel like the overhead of keeping up with the changes was equal to or larger than learning a new one every couple years.