All three wrap the same @ionic/core 9.0.5 components and render identical markup. They differ in how they fit each framework's routing and lifecycle:
| @ionic/react | @ionic/vue | @ionic/angular | |
|---|---|---|---|
| Framework versions | React 18 7,897 or 19 | Vue 3.5 5,482 or later | Angular 18 42,088 to 22 |
| Router | React Router 6 139,386 via @ionic/react-router | Vue Router 5 via @ionic/vue-router | Angular Router |
| Page outlet | IonReactRouter + IonRouterOutlet | <ion-router-outlet> | <ion-router-outlet> |
| Page lifecycle | useIonViewWillEnter() hooks | onIonViewWillEnter() | ionViewWillEnter() methods |
| Overlays | useIonToast(), useIonModal() hooks | toastController | injected ToastController |
| Starters | 5, Vite 25,978 | 4, Vite | 5, Angular CLI (modules or standalone) |
Learn the lifecycle row. Ionic keeps pages in the DOM after you navigate away, so a mount effect runs once, while ionViewWillEnter and its siblings fire on every visit. Refreshing data in useEffect is the classic Ionic React bug: the list goes stale after the first visit.