This is a complicated answer that would probably take experience developing real-world applications in both to fully appreciate, but I`ll bite.

A few years ago, I was CTO of a small startup and spent a significant portion of a year building out our mobile app in React Native.

I have experience building cross-platform mobile apps going all the way back from when Ionic was called Apache PhoneGap and was an entirely different product.

In my opinion, React Native is a classic case of follow-the-herd syndrome. This is not to say that React Native is not a viable technology, but simply that it just isn't very good. Let me dive into a few of the things that were really grating when developing on RN:

- The hot-reload times were painstakingly slow. I am talking about 15-20 seconds after save. This really takes a toll on development velocity.

- You have a major decision to make when building an RN app: To use Expo or not. Expo is an SDK which allows you to circumvent needing to drop down into the native build processes for each platform and provides wrapper APIs for accessing native hardware functionality on the phone, with the tradeoff being that a wide number of RN libraries were not compatible since they required being installed as Cocoa Pods or Gradle/Maven packages natively. So you are trading convenience and development speed for flexibility. We chose to go with Expo, and did not regret it.

- Performance is an issue in RN that you need to aggressively optimize against. I remember being aghast that rendering a scrollable list of 300 text items caused so much lag and stuttering it required a full day of manual optimization to calculate viewport area and which cells would be in view to prevent that work from being done by the element on-thread in order to be semi-usable. You have to be really cautious about your render cycles and everything else when building views.

- Doing heavy custom styling requires some hacky workarounds since RN wraps the native UI elements and does not expose all of the style API that they provide.

Later on, at another company, we ended up building an app with NativeScript + Vue which was a much better experience. NativeScript is essentially React Native, but allows you to use any JS/TS framework (or none at all) and has much better APIs for interacting with the device, and allows you to fully style the underlying device-specific UI element if you really need to. And the performance ran circles around RN. The entire experience was overall miles better. Very few people use NativeScript though, just due to the fact you never hear about it.

Ultimately, if I had to give advice, it would be this:

Either write a regular PWA web app, so that you can leverage existing web technologies and all the component libraries, and then add native functionalities and publish to the app store using the Capacitor framework that powers Ionic apps. Or just use Flutter.

Flutter has the only cross-platform mobile experience that does not feel really hacky to me. It does not try to compile to platform-specific view elements, instead compiling to native ARM code, and tries to maintain 120FPS. You can use the same Flutter codebase to generate mobile, web, and desktop apps. And the whole developer experience is really incredible. Instant stateful hot-reloading, screaming performance. Google put a lot of effort and thought into it, and Flutter is not going anywhere given that it powers all of Fuschias UI.