Loading...
Loading...
Compare original and translation side by side
ion-<ion-button><ion-content>iosmd<html>iosmdcapacitor-app-development@ionic/angular@ionic/react@ionic/vueion-<ion-button><ion-content>iosmd<html>iosmdcapacitor-app-development@ionic/angular@ionic/react@ionic/vuenpm install -g @ionic/cli
ionic start <name> <template> --type=<framework> --capacitor --package-id=<id> | Framework |
|---|---|
| Angular (NgModules) |
| Angular (Standalone Components) |
| React |
| Vue |
| Template | Description |
|---|---|
| Empty project, single page |
| Tab-based layout |
| Side menu layout |
npm install -g @ionic/cli
ionic start <name> <template> --type=<framework> --capacitor --package-id=<id> | 对应框架 |
|---|---|
| Angular(NgModules模式) |
| Angular(独立组件模式) |
| React |
| Vue |
| 模板名 | 说明 |
|---|---|
| 空项目,仅包含单个页面 |
| 基于标签栏的布局 |
| 侧边菜单布局 |
ionic --help| Command | Description |
|---|---|
| Scaffold a new Ionic project. |
| Start a local dev server with live reload (port 8100). |
| Build the web app for production. |
| Generate pages, components, services (framework-dependent). |
| Print system/environment info. |
| Remove and recreate dependencies and platform files. |
ionic serve--external--port=<port>--prod--no-openionic --help| 命令 | 说明 |
|---|---|
| 脚手架生成新的Ionic项目 |
| 启动带热重载的本地开发服务器(默认端口8100) |
| 构建生产环境的Web应用 |
| 生成页面、组件、服务(依赖所使用的框架) |
| 打印系统/环境信息 |
| 移除并重建依赖和平台相关文件 |
ionic serve--external--port=<port>--prod--no-openion-appion-contention-headerion-footerion-toolbarion-titleion-buttonsion-back-buttonion-gridion-rowion-colion-split-pane<ion-header>
<ion-toolbar>
<ion-buttons slot="start">
<ion-back-button defaultHref="/home"></ion-back-button>
</ion-buttons>
<ion-title>Page Title</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<!-- Scrollable content -->
</ion-content>ion-appion-contention-headerion-footerion-toolbarion-titleion-buttonsion-back-buttonion-gridion-rowion-colion-split-pane<ion-header>
<ion-toolbar>
<ion-buttons slot="start">
<ion-back-button defaultHref="/home"></ion-back-button>
</ion-buttons>
<ion-title>页面标题</ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<!-- 可滚动内容 -->
</ion-content>ion-tabsion-tab-barion-tab-buttonion-menuion-menu-buttonion-menu-toggleion-router-outletion-navion-breadcrumbsion-tabsion-tab-barion-tab-buttonion-menuion-menu-buttonion-menu-toggleion-router-outletion-navion-breadcrumbsion-inpution-textareaion-selection-select-optionion-checkboxion-toggleion-radioion-radio-groupion-rangeion-datetimeion-datetime-buttonion-searchbarion-segmention-segment-buttonion-input-otplabellabelPlacementfloatingstackedfixedstartfilloutlinesoliderrorTexthelperTextdisabledvalueplaceholderionInpution-inpution-textareaionChangeion-selection-toggleion-checkboxion-range<ion-input label="Email" labelPlacement="floating" fill="outline"
type="email" placeholder="you@example.com"
errorText="Invalid email" helperText="Enter your email">
</ion-input>
<ion-select label="Country" labelPlacement="floating" fill="outline" interface="popover">
<ion-select-option value="us">United States</ion-select-option>
<ion-select-option value="de">Germany</ion-select-option>
</ion-select>ion-inpution-textareaion-selection-select-optionion-checkboxion-toggleion-radioion-radio-groupion-rangeion-datetimeion-datetime-buttonion-searchbarion-segmention-segment-buttonion-input-otplabellabelPlacementfloatingstackedfixedstartfilloutlinesoliderrorTexthelperTextdisabledvalueplaceholderionInpution-inpution-textareaionChangeion-selection-toggleion-checkboxion-range<ion-input label="邮箱" labelPlacement="floating" fill="outline"
type="email" placeholder="you@example.com"
errorText="邮箱格式无效" helperText="请输入你的邮箱">
</ion-input>
<ion-select label="国家" labelPlacement="floating" fill="outline" interface="popover">
<ion-select-option value="us">美国</ion-select-option>
<ion-select-option value="de">德国</ion-select-option>
</ion-select>ion-modalion-alertion-toastion-action-sheetion-loadingion-popoverisOpentriggerbackdropDismissanimateddidPresentdidDismisswillPresentwillDismiss<ion-modal [isOpen]="isOpen" [breakpoints]="[0, 0.5, 1]" [initialBreakpoint]="0.5" [handle]="true">
<ion-content>Sheet content</ion-content>
</ion-modal>ion-modalion-alertion-toastion-action-sheetion-loadingion-popoverisOpentriggerbackdropDismissanimateddidPresentdidDismisswillPresentwillDismiss<ion-modal [isOpen]="isOpen" [breakpoints]="[0, 0.5, 1]" [initialBreakpoint]="0.5" [handle]="true">
<ion-content>弹窗内容</ion-content>
</ion-modal>ion-listion-itemion-item-slidingion-item-optionsion-item-optionion-cardion-card-headerion-card-contention-accordionion-accordion-groupion-chipion-badgeion-labelion-noteion-listion-itemion-item-slidingion-item-optionsion-item-optionion-cardion-card-headerion-card-contention-accordionion-accordion-groupion-chipion-badgeion-labelion-noteion-refresherion-refresher-contention-infinite-scrollion-infinite-scroll-contention-reorder-groupion-reorderion-refresherion-refresher-contention-infinite-scrollion-infinite-scroll-contention-reorder-groupion-reorderion-buttonion-fabion-fab-buttonion-iconion-avatarion-thumbnailion-spinnerion-skeleton-textion-progress-barion-buttonion-fabion-fab-buttonion-iconion-avatarion-thumbnailion-spinnerion-skeleton-textion-progress-barprimarysecondarytertiarysuccesswarningdangerlightmediumdarkcolor<ion-button color="primary">Save</ion-button>
<ion-button color="danger">Delete</ion-button>:root:root {
--ion-color-primary: #3880ff;
--ion-color-primary-rgb: 56, 128, 255;
--ion-color-primary-contrast: #ffffff;
--ion-color-primary-contrast-rgb: 255, 255, 255;
--ion-color-primary-shade: #3171e0;
--ion-color-primary-tint: #4c8dff;
}primarysecondarytertiarysuccesswarningdangerlightmediumdarkcolor<ion-button color="primary">保存</ion-button>
<ion-button color="danger">删除</ion-button>:root:root {
--ion-color-primary: #3880ff;
--ion-color-primary-rgb: 56, 128, 255;
--ion-color-primary-contrast: #ffffff;
--ion-color-primary-contrast-rgb: 255, 255, 255;
--ion-color-primary-shade: #3171e0;
--ion-color-primary-tint: #4c8dff;
}--ion-background-color--ion-text-color--ion-font-family--ion-safe-area-top/right/bottom/left--ion-margin--ion-padding--ion-background-color--ion-text-color--ion-font-family--ion-safe-area-top/right/bottom/left--ion-margin--ion-padding@ionic/angular/css/@ionic/react/css/@ionic/vue/css/@import '@ionic/<framework>/css/palettes/dark.system.css';@import '@ionic/<framework>/css/palettes/dark.always.css';@import '@ionic/<framework>/css/palettes/dark.class.css';.ion-palette-dark<html>@ionic/angular/css/@ionic/react/css/@ionic/vue/css/@import '@ionic/<framework>/css/palettes/dark.system.css';@import '@ionic/<framework>/css/palettes/dark.always.css';@import '@ionic/<framework>/css/palettes/dark.class.css';<html>.ion-palette-dark<html>.ios ion-toolbar { --background: #f8f8f8; }
.md ion-toolbar { --background: #ffffff; }http://localhost:8100/?ionic:mode=ios<html>.ios ion-toolbar { --background: #f8f8f8; }
.md ion-toolbar { --background: #ffffff; }http://localhost:8100/?ionic:mode=iosion-gridion-rowion-colsize| Breakpoint | Min Width | Property Suffix |
|---|---|---|
| 0 | |
| 576px | |
| 768px | |
| 992px | |
| 1200px | |
ion-gridion-rowion-colsize| 断点 | 最小宽度 | 属性后缀 |
|---|---|---|
| 0 | |
| 576px | |
| 768px | |
| 992px | |
| 1200px | |
.ion-padding.ion-padding-top/bottom/start/end.ion-no-padding.ion-margin.ion-margin-top/bottom/start/end.ion-no-margin.ion-text-center.ion-text-start.ion-text-end.ion-text-wrap.ion-text-nowrap.ion-display-none.ion-display-block.ion-display-flex.ion-justify-content-center.ion-align-items-center.ion-flex-row.ion-flex-column.ion-text-md-center.ion-padding.ion-padding-top/bottom/start/end.ion-no-padding.ion-margin.ion-margin-top/bottom/start/end.ion-no-margin.ion-text-center.ion-text-start.ion-text-end.ion-text-wrap.ion-text-nowrap.ion-display-none.ion-display-block.ion-display-flex.ion-justify-content-center.ion-align-items-center.ion-flex-row.ion-flex-column.ion-text-md-centerion-router-outletngOnInituseEffectonMounted| Hook | Fires When | Use For |
|---|---|---|
| Page about to enter (pre-animation) | Refresh data on every visit |
| Page fully entered (post-animation) | Start animations, focus inputs |
| Page about to leave (pre-animation) | Save state, pause subscriptions |
| Page fully left (post-animation) | Clean up off-screen resources |
ion-router-outletion-router-outletngOnInituseEffectonMounted| 钩子 | 触发时机 | 适用场景 |
|---|---|---|
| 页面即将进入(动画开始前) | 每次进入页面时刷新数据 |
| 页面完全进入(动画结束后) | 启动动画、聚焦输入框 |
| 页面即将离开(动画开始前) | 保存状态、暂停订阅 |
| 页面完全离开(动画结束后) | 清理页外资源 |
ion-router-outletsrc/main.tsbootstrapApplicationplatformBrowserDynamic().bootstrapModule| Aspect | Standalone | NgModule |
|---|---|---|
| Ionic setup | | |
| Component imports | Each from | |
| Lazy loading | | |
| Icons | | Automatic |
NavController@ionic/angularnavigateForwardnavigateBacknavigateRootbackrouterLinkrouterDirectionViewWillEnterViewDidEnterViewWillLeaveViewDidLeave@ionic/angularimport { ViewWillEnter } from '@ionic/angular';
@Component({ /* ... */ })
export class HomePage implements ViewWillEnter {
ionViewWillEnter() {
this.loadData(); // Runs on every page visit
}
}src/main.tsbootstrapApplicationplatformBrowserDynamic().bootstrapModule| 维度 | 独立组件模式 | NgModule模式 |
|---|---|---|
| Ionic初始化 | 在 | 在 |
| 组件导入 | 每个组件都从 | |
| 懒加载 | 路由中使用 | 路由中使用 |
| 图标 | 需要从 | 自动加载 |
@ionic/angularNavControllernavigateForwardnavigateBacknavigateRootbackrouterDirectionrouterLink@ionic/angularViewWillEnterViewDidEnterViewWillLeaveViewDidLeaveimport { ViewWillEnter } from '@ionic/angular';
@Component({ /* ... */ })
export class HomePage implements ViewWillEnter {
ionViewWillEnter() {
this.loadData(); // 每次进入页面都会执行
}
}setupIonicReact()src/main.tsxIonReactRouter@ionic/react-routerBrowserRouterIonRouterOutletcomponentrenderchildrenIonPageuseIonRouterimport { useIonRouter } from '@ionic/react';
const router = useIonRouter();
router.push('/detail/123', 'forward', 'push');
router.goBack();@ionic/reactimport { useIonViewWillEnter } from '@ionic/react';
useIonViewWillEnter(() => {
fetchData(); // Runs on every page visit
});useIonAlertuseIonToastuseIonActionSheetuseIonLoadinguseIonModaluseIonPopoveruseIonPickeronIonInputIonInputIonTextareaonIonChangeIonSelectIonToggleIonCheckboxIonRangee.detail.valuesrc/main.tsxsetupIonicReact()@ionic/react-routerIonReactRouterBrowserRouterIonRouterOutletcomponentrenderchildrenIonPageuseIonRouterimport { useIonRouter } from '@ionic/react';
const router = useIonRouter();
router.push('/detail/123', 'forward', 'push');
router.goBack();@ionic/reactimport { useIonViewWillEnter } from '@ionic/react';
useIonViewWillEnter(() => {
fetchData(); // 每次进入页面都会执行
});useIonAlertuseIonToastuseIonActionSheetuseIonLoadinguseIonModaluseIonPopoveruseIonPickerIonInputIonTextareaonIonInputIonSelectIonToggleIonCheckboxIonRangeonIonChangee.detail.valueIonicVuesrc/main.tscreateApp(App).use(IonicVue).use(router)createRouter@ionic/vue-routervue-routerIonPage@ionic/vue@ion-change@ion-inputionicons/iconsuseIonRouter<script setup lang="ts">
import { useIonRouter } from '@ionic/vue';
const ionRouter = useIonRouter();
ionRouter.push('/detail/123');
ionRouter.back();
</script><ion-button router-link="/detail" router-direction="forward">Go</ion-button>@ionic/vue<script setup lang="ts">
import { onIonViewWillEnter } from '@ionic/vue';
onIonViewWillEnter(() => {
fetchData(); // Runs on every page visit
});
</script>useIonRouter()useBackButton(priority, handler)useKeyboard()isPlatform(name)getPlatforms()$elcontentRef.value.$el.scrollToBottom(300)src/main.tsIonicVuecreateApp(App).use(IonicVue).use(router)@ionic/vue-routercreateRoutervue-routerIonPage@ionic/vue@ion-change@ion-inputionicons/iconsuseIonRouter<script setup lang="ts">
import { useIonRouter } from '@ionic/vue';
const ionRouter = useIonRouter();
ionRouter.push('/detail/123');
ionRouter.back();
</script><ion-button router-link="/detail" router-direction="forward">跳转</ion-button>@ionic/vue<script setup lang="ts">
import { onIonViewWillEnter } from '@ionic/vue';
onIonViewWillEnter(() => {
fetchData(); // 每次进入页面都会执行
});
</script>useIonRouter()useBackButton(priority, handler)useKeyboard()isPlatform(name)getPlatforms()$elcontentRef.value.$el.scrollToBottom(300)ion-tabsion-tab-bartabion-tab-buttonion-modalion-tabsion-tab-barion-tab-buttontabion-modalion-menucontentIdidion-router-outletion-menu-togglerouterDirection="root"ion-menucontentIdion-router-outletidion-menu-togglerouterDirection="root"npm run build
npx cap sync
npx cap run android
npx cap run iosionic cap run android --livereload --external
ionic cap run ios --livereload --externalcapacitor-app-developmentnpm run build
npx cap sync
npx cap run android
npx cap run iosionic cap run android --livereload --external
ionic cap run ios --livereload --externalcapacitor-app-developmentcapawesome-cloudcapawesome-cloudionic: command not foundnpm install -g @ionic/cli@ionic/angular/standaloneionViewWillEnterion-router-outletIonPageionViewWillEnterngOnInituseEffectonMountedNavControllerIonReactRoutercreateRouter@ionic/vue-router--background--coloraddIcons()ioniconsIonIcon@ionic/angular/standaloneFailed to resolve component: ion-*@ionic/vueIonRouterOutletIonTabsonIonInputIonInputIonTextareaonChangee.detail.value'vue/no-deprecated-slot-attribute': 'off'ionic: command not foundnpm install -g @ionic/cli@ionic/angular/standaloneionViewWillEnterion-router-outletIonPageionViewWillEnterngOnInituseEffectonMountedNavControllerIonReactRouter@ionic/vue-routercreateRouter--background--colorioniconsaddIcons()@ionic/angular/standaloneIonIconFailed to resolve component: ion-*@ionic/vueIonTabsIonRouterOutletIonInputIonTextareaonIonInputonChangee.detail.value'vue/no-deprecated-slot-attribute': 'off'ionic-app-creationionic-app-developmentionic-angularionic-reactionic-vueionic-app-upgradescapacitor-app-developmentcapawesome-cloudionic-app-creationionic-app-developmentionic-angularionic-reactionic-vueionic-app-upgradescapacitor-app-developmentcapawesome-cloud