小程序中如何用axios实现loading效果?

在小程序开发中,loading效果是提升用户体验的重要环节,它能够在数据加载、网络请求等耗时操作时给用户明确的反馈,Axios作为一款流行的HTTP客户端库,凭借其简洁的API和强大的功能,被广泛应用于小程序开发中,本文将详细介绍如何使用Axios实现小程序的loading效果,包括基本原理、具体实现步骤、优化方案及常见问题处理。

axios实现小程序loading

Axios与小程序Loading的结合原理

在小程序中,loading效果通常通过调用wx.showLoadingwx.hideLoadingAPI来实现。wx.showLoading用于显示loading提示框,wx.hideLoading用于隐藏,Axios作为请求库,可以在请求拦截器和响应拦截器中统一处理loading的显示与隐藏,从而避免在每个请求中重复调用相关API,提高代码的可维护性。

结合的核心思路是:在发起请求前通过拦截器调用wx.showLoading,在请求成功或失败后调用wx.hideLoading,为了防止多个请求同时触发多个loading,可以通过计数器或全局标志位来管理loading的显示状态。

基于Axios的Loading实现步骤

安装与引入Axios

在小程序项目中安装Axios,可以通过npm或yarn进行安装:

npm install axios

安装完成后,在项目需要的页面或工具类中引入Axios:

const axios = require('axios');

配置Axios实例

为了避免全局配置污染,建议创建一个独立的Axios实例,并配置基础信息(如 baseURL、timeout 等):

const request = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
  header: {
    'Content-Type': 'application/json'
  }
});

添加请求拦截器

在请求拦截器中,调用wx.showLoading显示loading,并可以统一处理请求头(如添加token):

request.interceptors.request.use(
  config => {
    wx.showLoading({
      title: '加载中...',
      mask: true // 防止触摸穿透
    });
    // 从本地存储获取token并添加到请求头
    const token = wx.getStorageSync('token');
    if (token) {
      config.header.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    wx.hideLoading();
    return Promise.reject(error);
  }
);

添加响应拦截器

在响应拦截器中,无论请求成功或失败,都需要调用wx.hideLoading隐藏loading,可以统一处理错误信息:

axios实现小程序loading

request.interceptors.response.use(
  response => {
    wx.hideLoading();
    const { data } = response;
    if (data.code === 200) {
      return data;
    } else {
      wx.showToast({
        title: data.message || '请求失败',
        icon: 'none'
      });
      return Promise.reject(data);
    }
  },
  error => {
    wx.hideLoading();
    const { response } = error;
    if (response) {
      // 服务器返回错误
      wx.showToast({
        title: response.data.message || '服务器错误',
        icon: 'none'
      });
    } else {
      // 请求超时或网络错误
      wx.showToast({
        title: '网络连接失败',
        icon: 'none'
      });
    }
    return Promise.reject(error);
  }
);

封装请求方法

为了方便调用,可以封装GET、POST等常用请求方法:

const http = {
  get(url, params) {
    return request.get(url, { params });
  },
  post(url, data) {
    return request.post(url, data);
  }
};

在页面中使用

在页面中调用封装的请求方法,loading效果会自动触发:

Page({
  onLoad() {
    http.get('/api/data', { id: 1 })
      .then(res => {
        console.log('请求成功', res);
      })
      .catch(err => {
        console.error('请求失败', err);
      });
  }
});

Loading状态的优化方案

防止重复显示Loading

当多个请求同时发起时,可能会出现多个loading叠加的问题,可以通过计数器来解决:

let loadingCount = 0;
request.interceptors.request.use(config => {
  if (loadingCount === 0) {
    wx.showLoading({ title: '加载中...', mask: true });
  }
  loadingCount++;
  return config;
});
request.interceptors.response.use(
  response => {
    loadingCount--;
    if (loadingCount === 0) {
      wx.hideLoading();
    }
    return response;
  },
  error => {
    loadingCount--;
    if (loadingCount === 0) {
      wx.hideLoading();
    }
    return Promise.reject(error);
  }
);

自定义Loading样式

小程序的loading支持自定义标题和图标,可以通过配置wx.showLoading的参数来实现:

wx.showLoading({ '正在加载...',
  mask: true,
  success: () => {
    console.log('loading显示成功');
  }
});

请求超时处理

在Axios实例中配置timeout,并在响应拦截器中处理超时错误:

request.interceptors.response.use(
  response => response,
  error => {
    if (error.code === 'ECONNABORTED') {
      wx.showToast({
        title: '请求超时',
        icon: 'none'
      });
    }
    return Promise.reject(error);
  }
);

常见问题与解决方案

问题1:loading不显示或隐藏失败

原因分析

  • 忘记在拦截器中调用wx.showLoadingwx.hideLoading
  • 调用wx.hideLoading时,wx.showLoading未执行。
  • 多个请求并发时,计数器逻辑错误。

解决方案

axios实现小程序loading

  • 检查拦截器配置,确保wx.showLoadingwx.hideLoading成对调用。
  • 使用计数器管理多个请求的loading状态。
  • 在调试模式下打印日志,确认执行流程。

问题2:loading遮挡页面内容

原因分析

  • 未设置mask: true,导致用户仍可点击页面内容。
  • loading层级过高,遮挡了其他组件。

解决方案

  • wx.showLoading中添加mask: true参数,防止触摸穿透。
  • 检查页面样式,确保loading的z-index合理。

FAQs

问题1:如何为不同请求设置不同的loading提示?
解答:可以在请求拦截器中根据请求的URL或参数动态设置loading的标题。

request.interceptors.request.use(config => {
  const loadingTitle = config.url.includes('/login') ? '登录中...' : '加载中...';
  wx.showLoading({ title: loadingTitle, mask: true });
  return config;
});

问题2:如何在请求失败时保留loading并显示错误提示?
解答:在响应拦截器的错误处理中,先隐藏loading,再显示错误提示,如果需要保留loading,可以延迟隐藏loading或使用自定义弹窗替代loading。

request.interceptors.response.use(
  response => {
    wx.hideLoading();
    return response;
  },
  error => {
    wx.hideLoading();
    wx.showToast({
      title: '请求失败,请重试',
      icon: 'none',
      duration: 2000
    });
    return Promise.reject(error);
  }
);

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/70505.html

(0)
酷番叔酷番叔
上一篇 1小时前
下一篇 1小时前

相关推荐

  • Windows如何保存cmd命令结果?

    在Windows命令提示符(cmd)中保存命令结果对记录操作和调试至关重要,常用高效方法包括使用重定向符(˃、˃˃)、复制粘贴输出内容,或生成带时间戳的日志文件,适用于Win7/8/10/11系统。

    2025年7月26日
    6200
  • dos命令怎么打开文本文件

    DOS命令提示符下,可使用type 文件名(若需查看内容)

    2025年8月10日
    4900
  • 如何安全显示U盘隐藏文件?

    通过系统设置显示隐藏文件(推荐首选)适用场景:常规隐藏文件恢复,操作简单安全步骤:将U盘插入电脑,打开此电脑/计算机,顶部菜单栏点击 “查看” → 勾选 “隐藏的项目”(Windows 10/11),(旧版系统:进入”控制面板”→”文件资源管理器选项”→”查看”→勾选”显示隐藏的文件、文件夹和驱动器”)返回U盘……

    2025年6月27日
    8000
  • 为何必须开展安全基线检查?其根本目的与关键意义到底何在?

    安全基线检查是组织信息安全管理体系中的基础性工作,其核心在于通过对照既定的安全标准,对系统、网络、应用等对象的配置、策略、运行状态进行系统性核查,识别与标准不符的项并推动整改,这一过程并非简单的“合规打卡”,而是为构建纵深防御体系、保障业务连续性、降低安全风险奠定关键基础的系统性工程,其目的可从合规保障、风险防……

    2025年11月18日
    1700
  • 安全专家服务价格受哪些因素影响?

    安全专家服务价格是企业在规划网络安全预算时需要重点考量的因素,随着数字化转型的深入,网络攻击手段日益复杂,企业对专业安全服务的需求持续增长,而服务价格的构成与影响因素也成为决策者关注的焦点,本文将从服务类型、价格构成、影响因素及市场趋势等方面,为您详细解析安全专家服务的价格体系,安全专家服务的主要类型及价格范围……

    3天前
    900

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信