ionic 加载动作

Ionic 加载动作(Loading)完整实战指南

(Ionic 7+,支持 Angular / React / Vue 都通用)

Ionic 提供了三种最常用的「加载中」组件,按使用频率排序:

组件用途是否可自定义内容推荐指数
ion-loading全屏蒙层加载(最常用)可以★★★★★
ion-spinner局部小转圈(配合按钮、列表)仅换样式★★★★
ion-progress-bar进度条(上传、下载)可以★★★

1. ion-loading(全屏加载,最常用!)

// 在任意页面或服务里注入
import { LoadingController } from '@ionic/angular';

constructor(private loadingCtrl: LoadingController) {}

// 显示加载
async showLoading() {
  const loading = await this.loadingCtrl.create({
    message: '正在加载,请稍候...',   // 文字
    spinner: 'circles',               // 转圈样式(见下表)
    duration: 3000,                   // 自动关闭(毫秒),0=不自动关
    translucent: true,                // 背景半透明
    backdropDismiss: false,           // 点击背景不关闭
    cssClass: 'my-loading',           // 自定义样式类
    // mode: 'ios'                    // 强制 iOS 风格
  });

  await loading.present();

  // 手动关闭(必须成对调用)
  // await loading.dismiss();
}

// 带延迟自动关闭的写法(最常用)
async showAutoLoading() {
  const loading = await this.loadingCtrl.create({
    message: '提交中...',
    duration: 2000
  });
  await loading.present();
}

超实用封装(推荐放 service 里全局调用)

// loading.service.ts
@Injectable({ providedIn: 'root' })
export class LoadingService {
  isLoading = false;

  constructor(public loadingController: LoadingController) {}

  async present(message = '加载中...') {
    this.isLoading = true;
    return await this.loadingController.create({
      message,
      spinner: 'crescent',
    }).then(a => {
      a.present().then(() => {
        if (!this.isLoading) {
          a.dismiss();
        }
      });
    });
  }

  async dismiss() {
    this.isLoading = false;
    return await this.loadingController.dismiss();
  }
}

使用:

await this.loading.present('正在保存...');
// ... 你的异步操作
await this.loading.dismiss();

2. ion-spinner(局部小转圈)

<!-- 配合按钮使用(最常见) -->
<ion-button [disabled]="isSubmitting">
  <ion-spinner name="dots" *ngIf="isSubmitting"></ion-spinner>
  <span *ngIf="!isSubmitting">提交</span>
  <span *ngIf="isSubmitting">提交中...</span>
</ion-button>

<!-- 页面顶部加载条 -->
<ion-spinner name="lines" color="primary"></ion-spinner>

<!-- 所有内置 spinner 样式(直接复制名字) -->
<ion-spinner name="lines"></ion-spinner>          <!-- 推荐 -->
<ion-spinner name="lines-small"></ion-spinner>
<ion-spinner name="bubbles"></ion-spinner>
<ion-spinner name="circles"></ion-spinner>         <!-- 经典 -->
<ion-spinner name="crescent"></ion-spinner>       <!-- 新版推荐 -->
<ion-spinner name="dots"></ion-spinner>

3. ion-progress-bar(进度条)

<!-- 固定进度 -->
<ion-progress-bar value="0.6" color="success"></ion-progress-bar>

<!-- 无限加载条(不确定进度) -->
<ion-progress-bar type="indeterminate"></ion-progress-bar>

<!-- 自定义颜色 + 缓冲 -->
<ion-progress-bar 
  value="0.4" 
  buffer="0.7" 
  color="warning">
</ion-progress-bar>

4. 最佳实践场景总结

你在做什么?推荐用哪个组件
页面首次加载、请求接口ion-loading(全屏)
提交表单、登录ion-loading + 按钮里放 ion-spinner
上拉加载更多ion-spinner 放在列表底部
文件上传、下载ion-progress-bar
想酷一点(自定义 HTML)ion-loading + message 写 HTML

5. 自定义超美 Loading(很多公司都这么玩)

const loading = await this.loadingCtrl.create({
  spinner: null,  // 关键!隐藏默认转圈
  message: `
    <div class="custom-loading">
      <img src="/assets/loading.gif" width="60">
      <div>拼命加载中...</div>
    </div>
  `,
  cssClass: 'custom-loading-class'
});
.custom-loading-class {
  --background: transparent;
  --color: white;
}
.custom-loading {
  text-align: center;
  padding: 20px;
}
.custom-loading img {
  animation: rotate 1.5s linear infinite;
}
@keyframes rotate {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

这样写出来的加载效果,在 iOS、Android 上都超级丝滑漂亮!

需要我直接发你一个「全局 Loading 拦截器(配合 HttpClient 自动显示/隐藏)」的完整代码吗?一句话就发~

文章已创建 2588

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部