小程序中如何用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)
酷番叔酷番叔
上一篇 2025年12月12日 21:10
下一篇 2025年12月12日 21:27

相关推荐

  • 国内CAP云存储配置步骤详解?

    注册账号,创建存储桶,获取访问密钥,在配置文件中填入参数并保存生效。

    2026年3月2日
    2300
  • 安全tsdb直播

    安全TSDB直播:构建实时监控与威胁响应的坚固防线在数字化时代,数据安全已成为企业运营的核心命脉,随着网络攻击手段的日益复杂化,传统的安全日志分析工具已难以满足实时威胁检测的需求,时间序列数据库(TSDB)凭借其高效的数据处理能力和实时性优势,正逐渐成为安全监控领域的关键技术,结合直播形式的安全TSDB应用实践……

    2025年11月30日
    8600
  • 命令行无法启动Atom?

    Windows 系统安装时自动配置安装Atom时勾选 Add to PATH 选项(默认已勾选),安装后可直接在命令行使用,手动配置(若未自动添加)打开Atom,按 Ctrl+, 进入设置 → 点击 Install Shell Commands,或手动添加Atom路径到系统变量:重启命令行,测试命令: atom……

    2025年6月30日
    13500
  • 如何安全地给MySQL赋值?

    在MySQL数据库管理中,安全赋值是保障数据完整性和系统稳定性的核心环节,不当的赋值操作可能导致数据泄露、权限滥用甚至数据库崩溃,本文将从基础语法、最佳实践、常见风险及应对策略等方面,系统阐述MySQL安全赋值的要点,MySQL赋值的基础语法MySQL中的赋值操作主要通过SET语句和UPDATE语句实现,SET……

    2025年12月9日
    7000
  • 安仔虚拟主机有哪些核心优势适合中小企业?

    虚拟主机作为个人和企业搭建网站的基础工具,其性能、稳定性和易用性直接影响线上业务的开展,在众多虚拟主机产品中,“安仔虚拟主机”凭借其针对国内用户优化的配置、贴心的服务以及高性价比,逐渐成为许多开发者和中小企业的首选,本文将从核心优势、配置套餐、适用场景及技术支持等方面,详细解析安仔虚拟主机的特点,帮助用户全面了……

    2025年11月4日
    6600

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信