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

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

axios实现小程序loading

Axios与小程序Loading的结合原理

在小程序中,loading效果通常通过调用wx.showLoading和wx.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.showLoading或wx.hideLoading。
  • 调用wx.hideLoading时,wx.showLoading未执行。
  • 多个请求并发时,计数器逻辑错误。

解决方案:

axios实现小程序loading

  • 检查拦截器配置,确保wx.showLoading和wx.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)
酷番叔酷番叔
上一篇 2025年12月12日 21:10
下一篇 2025年12月12日 21:27

相关推荐

  • Attention机制如何革新深度学习?

    在深度学习领域,attention机制作为一种核心的技术范式,彻底改变了模型处理序列数据的方式,传统的循环神经网络(RNN)和长短期记忆网络(LSTM)虽然能够捕捉序列中的时序依赖关系,但在处理长序列时往往面临梯度消失或梯度爆炸的问题,且难以并行计算,而attention机制通过动态关注输入序列中的关键信息,有……

    2025年12月16日
    24600
  • 埃微i6消息推送服务未运行怎么办?

    埃微i6消息推送服务没有运行是许多用户在使用该智能手表时可能遇到的问题,这一问题不仅影响实时消息的接收,还可能导致重要通知被遗漏,给日常生活和工作带来不便,为了帮助用户全面了解该问题的成因、解决方法及预防措施,本文将进行详细阐述,消息推送服务未运行的常见原因埃微i6消息推送服务依赖多个组件的协同工作,任何一个环……

    2025年12月11日
    20700
  • Windows命令提示符为何突然失效?

    基础排查(适合所有用户)检查快捷方式路径按 Win + R 输入 cmd 直接运行若提示”找不到文件”,说明系统路径被破坏,需修复环境变量:控制面板 > 系统和安全 > 系统 > 高级系统设置 > 环境变量检查 Path 变量是否包含 %SystemRoot%\system32(Wind……

    2025年7月26日
    61600
  • cdr镜像命令如何用?新手操作步骤详解

    CorelDRAW(简称CDR)中的镜像命令是设计过程中常用的功能,主要用于快速创建对象的对称图形、调整元素方向或制作重复图案,无论是水平翻转、垂直翻转还是对角线镜像,掌握镜像命令的使用方法都能显著提升设计效率,本文将从基础操作到进阶技巧,详细讲解CDR镜像命令的具体用法,帮助用户快速上手并灵活应用,镜像命令的……

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

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

    2025年6月27日
    85700

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信