It's also a very strange way to write a renderer, since you want your renderer to be pass-based, rather than object-based. React + Three.JS is just the wrong level of abstraction, since Three.JS a scene graph toolkit.
useFrame binds a single component to the render-loop. But in a managed way. Once the component unmount, it's getting taken out. You can also stack calls like that with something like a z-index, which is awesome for effects.
Flutter looks like it could be quite interesting for this - on mobile it compiles over to native machine code and uses GL or whatever.
I haven't looked at the details for web, but I think it does webasm and canvas, etc. and with the architecture they have it could potentially be a lot faster than traditional JS frameworks https://flutter.dev/web
You tell react what you want your scene graph to look like in the end. You don’t have to write down how to update. Which removes a whole class of bugs AND simplifies code A LOT