协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
ionic-vue【开发与工程】Guides the agent through Ionic Vue development patterns — project structure, Vue-specific Ionic components (IonPage, IonRouterOutlet, IonTabs), navigation with Vue Router and useIonRouter, Ionic lifecycle hooks (onIonViewWillEnter, onIonViewDidEnter, onIonViewWillLeave, onIonViewDidLeave), composable utilities (useIonRouter, useBackButton, useKeyboar…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Develop Ionic apps with Vue — project structure, components, navigation, lifecycle hooks, composables, and Vue-specific patterns.
@ionic/vue.package.json dependencies (@ionic/vue, vue, @capacitor/core), platforms (android/, ios/), build tools (vite.config.ts), and TypeScript usage. Only ask the user when something cannot be detected.<script setup> (Composition API) or Options API and generate code that matches the existing style. Default to <script setup lang="ts"> for new files unless the project uses a different pattern.Auto-detect the following by reading project files:
@ionic/vue version from package.json.vue version from package.json.@capacitor/core version from package.json (if present).tsconfig.json exists and if .vue files use <script setup lang="ts">.android/, ios/).src/router/index.ts).App.vue.A standard Ionic Vue project follows this structure:
project-root/
├── android/ # Android native project (generated by Capacitor)
├── ios/ # iOS native project (generated by Capacitor)
├── public/
├── src/
│ ├── components/ # Reusable Vue components
│ ├── composables/ # Custom composables
│ ├── router/
│ │ └── index.ts # Vue Router configuration (uses @ionic/vue-router)
│ ├── theme/
│ │ └── variables.css # Ionic CSS custom properties
│ ├── views/ # Page components (routed views)
│ ├── App.vue # Root component (contains IonApp + IonRouterOutlet)
│ └── main.ts # Entry point (installs IonicVue plugin)
├── capacitor.config.ts # Capacitor configuration
├── package.json
├── tsconfig.json
└── vite.config.ts
If the project does not follow this structure, adapt all guidance to the project's actual directory layout. Do not restructure the project unless the user explicitly asks.
The entry point src/main.ts installs the IonicVue plugin and mounts the app:
import { createApp } from 'vue';
import { IonicVue } from '@ionic/vue';
import App from './App.vue';
import router from './router';
/* Ionic CSS */
import '@ionic/vue/css/core.css';
import '@ionic/vue/css/normalize.css';
import '@ionic/vue/css/structure.css';
import '@ionic/vue/css/typography.css';
import '@ionic/vue/css/padding.css';
import '@ionic/vue/css/float-elements.css';
import '@ionic/vue/css/text-alignment.css';
import '@ionic/vue/css/text-transformation.css';
import '@ionic/vue/css/flex-utils.css';
import '@ionic/vue/css/display.css';
/* Theme */
import './theme/variables.css';
const app = createApp(App).use(IonicVue).use(router);
router.isReady().then(() => {
app.mount('#app');
});
The root App.vue contains IonApp and IonRouterOutlet:
<template>
<ion-app>
<ion-router-outlet />
</ion-app>
</template>
<script setup lang="ts">
import { IonApp, IonRouterOutlet } from '@ionic/vue';
</script>
Read references/components.md for detailed component patterns.
Key rules:
@ionic/vue — e.g., import { IonButton, IonContent, IonPage } from '@ionic/vue'.IonPage as its root template element. Without it, page transitions break and Ionic lifecycle hooks do not fire.$el — e.g., contentRef.value.$el.scrollToBottom(300).ionicons/icons — never pass icon names as strings.v-model on Ionic form components (IonInput, IonToggle, IonSelect, IonCheckbox, IonRange).@ion-change, @ion-infinite.Read references/navigation.md for detailed routing patterns.
Key principles:
createRouter from @ionic/vue-router, not from vue-router. The Ionic version wraps Vue Router to enable page transitions.router-link attribute on Ionic components with optional router-direction and router-animation.useIonRouter composable for Ionic-specific transitions, or useRouter from vue-router for standard navigation.component: () => import('@/views/DetailPage.vue').IonTabs and IonRouterOutlet. Each tab maintains its own navigation stack.IonModal for views shared across tabs.Read references/lifecycle.md for detailed lifecycle patterns.
Key principles:
IonRouterOutlet keeps pages in the DOM. Vue's onMounted fires only once per page, not on every visit.onIonViewWillEnter — Refresh data every time the page appears.onIonViewDidEnter — Start animations or focus inputs after the page transition finishes.onIonViewWillLeave — Save state or unsubscribe.onIonViewDidLeave — Clean up off-screen resources.IonPage as the root element.Read references/composables.md for detailed composable documentation.
Available composables and utilities from @ionic/vue:
| Function | Purpose |
|---|---|
useIonRouter() | Programmatic navigation with transition control |
useBackButton(priority, handler) | Handle Android hardware back button |
useKeyboard() | Reactive keyboard visibility and height |
onIonViewWillEnter(cb) | Lifecycle: page about to show |
onIonViewDidEnter(cb) | Lifecycle: page fully visible |
onIonViewWillLeave(cb) | Lifecycle: page about to hide |
onIonViewDidLeave(cb) | Lifecycle: page fully hidden |
isPlatform(name) | Check current platform (ios, android, hybrid, etc.) |
getPlatforms() | Get array of all matching platform identifiers |
Use isPlatform from @ionic/vue to conditionally execute platform-specific logic:
<script setup lang="ts">
import { isPlatform } from '@ionic/vue';
const isIOS = isPlatform('ios');
const isAndroid = isPlatform('android');
const isNative = isPlatform('hybrid');
const isMobileWeb = isPlatform('mobileweb');
</script>
<template>
<div>
<p v-if="isNative">Running as a native app</p>
<p v-else>Running in a browser</p>
</div>
</template>
Supported identifiers: android, capacitor, cordova, desktop, electron, hybrid, ios, ipad, iphone, mobile, mobileweb, phablet, pwa, tablet.
After implementing changes:
npm run build
npx cap sync
npx cap run android
npx cap run ios
For development with live reload:
ionic serve
For native live reload:
ionic cap run android --livereload --external
ionic cap run ios --livereload --external
Failed to resolve component: ion-*: The Ionic component is not imported. Add the missing import from @ionic/vue in the <script> section (e.g., import { IonButton } from '@ionic/vue').IonPage as its root template element. Without IonPage, transitions and lifecycle hooks silently fail.IonPage is the root element and the component is directly mapped to a route in the router configuration. Lifecycle hooks do not fire on child components.Method on component is not a function: Access the underlying Web Component via $el — e.g., ref.value.$el.scrollToBottom(), not ref.value.scrollToBottom().'vue/no-deprecated-slot-attribute': 'off'.ion-modal-did-present) and in addEventListener calls. Do not use camelCase.useIonRouter or useBackButton fails: These composables use Vue's inject() internally and must be called inside setup() or <script setup>, not in standalone functions or callbacks.router.go() with non-linear (tab-based) routing. Use useIonRouter().push() or router-link instead.onMounted fires only once: IonRouterOutlet caches pages in the DOM. Use onIonViewWillEnter instead of onMounted for logic that must run every time the page is shown.IonPage as the root element. IonPage sets up the proper flexbox layout.ionic-app-development — General Ionic development guidance: components, theming, CLI usage.ionic-app-creation — Create a new Ionic app from scratch.capacitor-vue — Capacitor-specific Vue patterns (plugins, hooks, services) without Ionic Framework.ionic-app-upgrades — Upgrade Ionic Framework to a newer version.