Googlebot can render JavaScript. That doesn't mean it will, on your timeline, for every page. A lot of React content never gets far enough to be seen.
Google crawls JavaScript sites in two passes. First it fetches the raw HTML and queues the page. Later, when resources allow, it renders the page in a headless browser to see what JavaScript adds. That second pass can happen minutes after the first, or days later, depending on how much Google currently trusts your site.
For a small, established site, the gap is usually small. For a new site or a large one with thousands of pages, that gap is where content quietly falls through. If a page depends entirely on client-side rendering to show its real content, and Google hasn't gotten to the render pass yet, that page might sit indexed with almost nothing in it.
Each of these works fine for a visitor with JavaScript enabled and a fast connection. None of them are guaranteed to work the same way for a crawler on its first, unrendered pass, or even its rendered one.
Server-side rendering or static generation for anything you actually want to rank removes the guesswork entirely: the content is in the HTML the first time anyone, human or bot, asks for the page. Real anchor tags for internal links matter for the same reason. Google discovers new pages primarily by following links in HTML, not by executing your router's click handlers.
If Google can render your homepage but can't reach your product pages through real links, the homepage is effectively the only page that was ever really indexed.
Use Search Console's URL Inspection tool on a page that matters, then look at the rendered HTML it shows you. If your main content, title, and internal links aren't there, that's what Google is actually working with, regardless of what a visitor sees in a browser.
If any of this sounds familiar, I run the same kind of audit for real businesses.