Vue全局loading及错误提示的思路与实现

本文将详细讲解如何通过Vue全局loading及错误提示来提供良好的用户体验。该方案可用于任何基于Vue构建的项目,并且易于扩展。

需求分析

在处理异步请求时,用户需要了解操作的进展情况和任何错误信息。此时,全局loading和错误提示成为必要功能。解决方案需要解决以下需求:

  • 可在应用程序中的所有组件中使用loading和错误提示。
  • loading和错误提示需要允许用户自定义。
  • 所有组件及单页应用必须支持异步路由请求。

实现思路

为实现全局loading及错误提示,我们需要在Vue根实例中添加两个成员变量:

data() {
  return {
    loading: false,
    error: null
  };
}

当我们需要显示loading或错误提示时,可以通过更新这两个变量的方式来控制显示/hide状态。

  • loading: 当数据正在加载时这个值为true,当数据加载完成时这个值设置为false。
  • error:当数据在请求时发生错误时,将错误信息赋值给这个变量。

实现全局的loading

我们首先来看如何实现全局loading。我们通过axios的拦截器,可以监听所有请求的发出和响应。当请求发出时,我们设置loading状态为true, 当请求响应后,我们设置loading状态为false。

import axios from 'axios';

axios.interceptors.request.use(config => {
  // 请求发出前 显示loading
  this.loading = true;
  return config;
}, error => {
  // 发出请求错误时 不需要显示loading
  return Promise.reject(error);
});

axios.interceptors.response.use(response => {
  // 响应完成后  关闭loading
  this.loading = false;
  return response;
}, error => {
  // 响应发生错误时, 关闭loading并设置错误信息
  this.loading = false;
  this.error = error.response.data.message || error.message;
  return Promise.reject(error);
});

在上面的代码中,我们扩展了axios的拦截器,添加了两个监听函数,用于在请求发出前和请求响应后进行状态调整。

实现全局的错误提示

接下来,我们来看如何实现全局的错误提示。我们可以在根Vue实例中注册一个全局错误处理程序,然后在任何地方发生错误时捕获并处理这些错误。可以考虑使用Vue的插件机制封装全局错误处理程序。

import Vue from 'vue';

const Toast = {};
Toast.install = function(Vue, options) {
  Vue.prototype.$toast = (message) => {
    const Component = Vue.extend({
      template: `<div class="toast toast-active">
        <div class="toast-message">${message}</div>
      </div>`
    });

    const component = new Component().$mount();
    document.body.appendChild(component.$el);

    setTimeout(() => {
      document.body.removeChild(component.$el);
    }, 3000);
  };
};

Vue.use(Toast);

上述代码中,我们创建一个Toast插件。该插件注册了一个$toast方法,显示错误消息。当该方法被调用时,该方法会将消息渲染到页面上,然后在3秒钟后自动消失。

现在,我们可以扩展我们的axios拦截器,以使用$toast方法来显示错误消息。当我们发生请求错误时,设置错误信息并通过插件的方式显示出来。

axios.interceptors.response.use(response => {
  // 响应完成后  关闭loading
  this.loading = false;
  return response;
}, error => {
  // 响应发生错误时, 关闭loading并设置错误信息
  this.loading = false;
  this.error = error.response.data.message || error.message;
  this.$toast(this.error);
  return Promise.reject(error);
});

示例

下面是如何在组件中使用全局loading和错误提示的示例:

<template>
  <div>
    <button @click="loadData">加载数据</button>

    <div v-if="loading">正在加载...</div>

    <div v-else>
      <div v-if="error">{{ error }}</div>
      <ul>
        <li v-for="item in items">{{ item.name }}</li>
      </ul>
    </div>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      items: [],
      loading: false,
      error: null
    };
  },

  methods: {
    async loadData() {
      this.loading = true;
      try {
        const res = await axios.get('/api/items');
        this.items = res.data.items;
      } catch(err) {
        this.error = err.message || err.response.data.message;
      }
      this.loading = false;
    }
  }
};
</script>

在上面的代码中,我们首先在组件中绑定loadingerror状态。当我们点击loadData按钮时,设置loading状态为true,执行ajax请求,请求完成后将获取的数据保存在items变量中,如果请求发生错误,则设置错误信息到error变量中。

接下来,使用v-if指令根据loadingerror变量来显示或隐藏加载信息和错误信息。在数据准备好之后,我们显示items数据。

总结

通过拦截器和插件,我们可以轻松地实现全局loading和错误提示。在以上文中的实现过程中,我们使用了axios作为ajax库,但实际上,这种方法也可以应用于其他ajax库。如有问题请随时联系。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue全局loading及错误提示的思路与实现 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 跟我学Node.js(四)—Node.js的模块载入方式与机制

    跟我学Node.js(四)—Node.js的模块载入方式与机制 什么是模块 在Node.js中,每一个JavaScript文件都可以看作为一个独立的模块,而这些模块可以被其他JavaScript文件所引用和调用。模块可以帮助我们实现代码的重用,提高开发效率。 Node.js支持的模块载入方式 Node.js支持两种方式进行模块的载入:同步和异步。 同步方…

    node js 2023年6月8日
    00
  • Node.js readline 逐行读取、写入文件内容的示例

    Node.js 是一款基于 Chrome V8 引擎的 JavaScript 运行时,它提供了许多强大的 API,包括文件系统 API 和行读写 API,使得我们可以轻松地对文件进行读写和处理。 本文将为大家讲解如何使用 Node.js 的 readline API 对文件进行逐行读取和写入。具体步骤如下: 步骤一:引入 readline 和 fs 模块 首…

    node js 2023年6月8日
    00
  • node.js的exports、module.exports与ES6的export、export default深入详解

    node.js的exports、module.exports与ES6的export、export default深入详解 简介 在 Node.js 中,我们可以通过模块系统(Module System)来定义和使用模块。模块可以是一个文件或用 npm 安装的一个包。在模块中,我们可以导出(Export)一些变量、函数或类,供其他模块使用。 在 Node.js…

    node js 2023年6月8日
    00
  • 使用html2canvas.js实现页面截图并显示或上传的示例代码

    使用html2canvas.js实现页面截图是一种常见的需求。本攻略将为您提供一份完整的使用html2canvas.js实现页面截图并显示或上传的示例代码。 环境准备 在开始之前,请确保您已经安装了如下依赖: html2canvas.js:用于截图 jQuery:用于简化DOM操作和事件绑定 以下是示例中将用到的HTML代码: <!DOCTYPE ht…

    node js 2023年6月8日
    00
  • 浅谈react性能优化的方法

    下面是详细讲解“浅谈React性能优化的方法”的完整攻略。 浅谈React性能优化的方法 在使用React进行开发时,随着项目体量和复杂度的增加,可能会遇到性能方面的问题。本文介绍了一些React性能优化的方法,可以帮助您更好地优化项目性能。 一、使用PureComponent或React.memo 对于一些简单的组件,可以使用PureComponent或R…

    node js 2023年6月8日
    00
  • nodejs前端模板引擎swig入门详解

    让我来详细讲解一下“nodejs前端模板引擎swig入门详解”的完整攻略。 标题 nodejs前端模板引擎swig入门详解 简介 Swig是一款简单、快速、可扩展的 JavaScript 模板引擎。Swig能够在Node.js和浏览器中运行,因此它不仅适用于服务器端的视图,还适用于浏览器端的JavaScript模板引擎。Swig具有一个内置缓存系统,能显著提…

    node js 2023年6月8日
    00
  • 整理一些JavaScript的IE和火狐的兼容性注意事项

    下面是一份详细的“整理JavaScript兼容性注意事项”的攻略。 1. 兼容性问题的背景介绍 在Web开发中,由于不同的浏览器采用不同的JavaScript引擎,因此会出现一些浏览器兼容性的问题。而这些问题往往会影响到代码的运行及网站的正常功能。特别是在IE和火狐这两款浏览器中,会出现比较明显的兼容问题。因此,我们需要在编写JavaScript代码时,重视…

    node js 2023年6月8日
    00
  • Node.js巧妙实现Web应用代码热更新

    Node.js 巧妙实现 Web 应用代码热更新可以通过 nodemon 这个工具来实现,具体步骤如下: 1. 安装 nodemon nodemon 是一个基于 Node.js 开发的工具,能够自动监控 Node.js 应用的服务更改,并在更改后重启 Node.js 应用程序。因此,我们需要先在本地安装 nodemon。在命令行中输入以下命令: npm in…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部