vue+element项目中页面多个接口异常,只提示一次异常信息

原文:https://blog.youkuaiyun.com/weixin_41662207/article/details/134971138?spm=1001.2014.3001.5502

有时候一个页面会同时调多个接口,但是多个接口异常,需要做提示,那么提示的时候会弹出很多的提示信息,这无疑让体验感降低很多。  所以针对这种情况,我们配合element UI统一做一个异常状态的处理,只能显示一次提示的功能,后续代码调接口的时候也可以省略去写异常状态下的逻辑了。

一、首先新建一个文件 messageOnce.js,内容如下:

import {Message} from 'element-ui'
// 私有属性,只在当前文件可用
const showMessage = Symbol('showMessage')
export default class domMessage {
    success (options, single = true) {
        this[showMessage]('success', options, single)
    }
    warning(options, single = true) {
        this[showMessage]('warning', options, single)
    }
    info(options, single = true) {
        this[showMessage]('info', options, single)
    }
    error(options, single = true) {
        this[showMessage]('error', options, single)
    }
    [showMessage] (type, options, single) {
        if (single) {
            // 判断当前页是否有el-message标签,如果没有则执行弹窗操作
            if (document.getElementsByClassName('el-message').length === 0) {
                Message[type](options)
            }
        } else {
            Message[type](options)
        }
    }
}

二、需要在你的响应拦截器(interceptors.response.use)的页面去引入刚才的文件,我取名为domMessage

import domMessage from './messageOnce'

三、new 对象实例

const messageOnce = new domMessage()

四、在响应拦截器中去写

if (response.data.code && JSON.parse(response.data.code) == 500) {
      messageOnce.error({
        message: '系统异常'+response.data.msg,
        type: 'error'
      })
}

### 如何在 Vue 项目中实现多个接口请求并统一处理错误提示Vue 项目中,可以通过封装 Axios 来集中管理 HTTP 请求逻辑,并利用拦截器机制对所有请求和响应进行全局控制。这样不仅可以减少重复代码,还能提升项目的可维护性和一致性。 #### 封装 Axios 实现统一错误提示 以下是基于 `Axios` 的封装方式,能够有效解决多接口请求时的错误提示问题: 1. **创建 Axios 配置文件** 创建一个专门用于封装 Axios 的文件(如 `src/api/index.js`),在此处定义基础配置、请求/响应拦截器等内容。 ```javascript // src/api/index.js import axios from 'axios'; import { Message } from 'element-ui'; // 或者 ant-design-vue 中的通知组件 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 设置默认的基础 URL timeout: 5000, // 超时时间 (毫秒) }); // 添加请求拦截器 service.interceptors.request.use( config => { // 可以在这里添加 token 等通用参数到请求头部 const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); // 添加响应拦截器 service.interceptors.response.use( response => { const res = response.data; // 如果返回的状态码不是成功状态,则抛出异常 if (!res.success || res.code !== 200) { Message.error(res.message || 'Error'); // 使用消息框展示错误信息 return Promise.reject(new Error(res.message || 'Request failed')); } return res; // 返回成功的数据部分 }, error => { let message = ''; if (error && error.response) { switch (error.response.status) { case 401: message = 'Unauthorized access!'; break; case 403: message = 'Forbidden!'; break; case 404: message = 'Resource not found!'; break; default: message = error.message || 'Network or server issue.'; } } else { message = 'No network connection.'; // 当无网络连接时给出提示 } Message.error(message); // 显示错误提示 return Promise.reject(error); } ); export default service; ``` 上述代码实现了以下功能: - 定义了一个 Axios 实例 `service` 并设置了基本选项[^4]。 - 在请求发送之前加入必要的认证令牌或其他公共字段[^1]。 - 对服务器返回的数据进行了初步解析,当检测到失败的结果时会自动触发错误通知[^3]。 - 提供了针对常见 HTTP 错误状态码的具体反馈信息。 2. **调用封装后的服务** 在实际业务场景下,只需简单引入此模块即可完成复杂的 API 调用操作而无需关心底层细节。 ```javascript // 示例:某个页面内的方法 import request from '@/api'; async function fetchData() { try { const result = await request.get('/some-endpoint', { params: {} }); console.log(result); } catch (err) { // 此处不需要额外捕获错误,因为已经由 interceptors 自动处理过了 } } ``` 通过以上设计模式,在整个应用生命周期内都可以享受到一致性的用户体验以及更加简洁明了的服务层架构[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值