Vue+Vuex 实现全局统一错误提示

背景:最近做的Vue项目里需要实现全局统一错误提示组件

之前的错误提示统一放在axios封装的组件里,因为请求的时候无法访问vue实例,只好单独引入实现。

法一:引入element-ui样式
import { Message } from 'element-ui';
service.interceptors.response.use(response => {
        //status:2xx
        return response.data;
}, err => {
    //status:outside the range of 2xx 
    if (err && err.response) {
        //各种常见的错误类型判断
        err.message = '请求错误'
    } else {
        err.message = '网络出现问题,请稍后重试'
    }
    Message.error(err.message);
})
法二:引入vue,进行实例化后调用element-ui(main.js里面处理过)
import Vue from 'vue'
new Vue().$message.error(err.message);

按照上述思路,如果使用新封装的全局统一错误提示组件,就要在请求的时候引入这个组件,像引入element-ui里的Message一样。这就比较麻烦了,挂载到哪个 DOM上?body?为什么不能挂载到当前组件的节点?

此路不通,不是最佳实现办法,需要转换下思路了:能不能在根组件App.vue中引入错误组件,通过某种状态触发呢?恰好Vue里有watch侦听器,参考了下别人的文章,上码:

  1. 新建store---->error.js,需要在store/index.js里引用

    export default {
    state: {
    flag: false,
    msg: ‘’
    },
    getters:{
    // 统一错误信息
    errorFlag: state => state.flag,
    errorMsg: state => state.msg
    },
    mutations: {
    changeFlag(state, msg) {
    state.msg = msg
    state.flag = !state.flag
    },
    },
    actions: {
    changeFlag({ commit, rootState }, msg) {
    commit(‘changeFlag’, msg)
    }
    }
    }

  2. App.vue里面获取和监听错误状态

    import { mapGetters } from “vuex”;
    computed: {
    …mapGetters([“errorFlag”, “errorMsg”]),
    },
    watch: {
    errorFlag(newFlag, oldFlag) {
    this.$message.error(this.errorMsg);
    },
    },

  3. 最最关键的一步:在axios组件触发错误信息更新

    import store from ‘…/store/index’
    //中间代码省略
    if (err && err.response) {
    //各种常见的错误类型判断
    err.message = ‘请求错误’
    } else {
    err.message = ‘网络出现问题,请稍后重试’
    }
    store.dispatch(‘changeFlag’, err.message);

这样在App.vue 里面就可以引入封装好的统一的错误组件,将this.$message换掉就ok了。

参考:
[Vue全局错误提示的一点思考]

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土豆片片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值