react 离开页面 axios 取消请求

import React from 'react'
import { Route, Switch, withRouter } from 'react-router-dom'
import axios from 'axios'
import { Toast } from 'antd-mobile'
import ReactDOM from 'react-dom'
import Error from '../components/Error'

import Home from '../pages/Home'
import NoPage from '../pages/404'
import Login from '../pages/Login'

class Interceptors extends React.Component {
    constructor(props) {
        super(props)
        this.errorDom = null
        this.cancel = null
    }


    componentDidMount() {
        // 监听路由变化
        this.props.history.listen(route => {
            if (this.cancel) {
                this.cancel("取消请求")
                Toast.hide()
            }
        })
    }


    renderError() {
        if (this.errorDom) {
            return
        }
        this.errorDom = document.createElement('div')
        ReactDOM.render(
            <Error reload={() => {
                this.errorDom.remove()
                window.location.reload()
            }}
            goBack={() => {
                this.errorDom.remove()
                this.props.history.goBack()
            }}
            />, this.errorDom)
        document.body.appendChild(this.errorDom)
    }

    componentWillMount() {
        let cancelToken = axios.CancelToken
        /**
        * 添加请求拦截器
        */
        axios.interceptors.request.use(config => {
            this.errorDom && this.errorDom.remove()
            config.headers['token'] = getToken()
            config.cancelToken = new cancelToken(c => {
                this.cancel = c
            })
            return config
        }, error => {
            return Promise.reject(error)
        })

        /**
        * 添加响应拦截器
        */
        axios.interceptors.response.use(response => {
            const { data, msg, success } = response.data
            if (success === -1) {
                this.props.history.push('/login')
                return ''
            }
            if (success === false) {
                Toast.info(msg, 2)
                return Promise.reject(msg)
            }
            return data || response.data
        }, error => {
            if (axios.isCancel(error)) {
                return Promise.reject(error)
            }
            Toast.fail('服务器出错', 2)
            this.renderError()
            return Promise.reject(error)
        })
    }

    render() {
        return (
            <div>
                <Switch>
                    <Route path='/home' component={Home} />
                    <Route path='/404' component={NoPage} />
                    <Route path='/login' component={Login} />
                </Switch>
            </div>
        )
    }
}

export default withRouter(Interceptors)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近在工作中遇到这样的需求,新用户在第一次登录的时候需要强制修改密码。刚开始接到这个需求的时候,心里想着在axio...
    sunshineLWZL阅读 15,489评论 1 8
  • 我们在做项目的时候,为了防止一些用户的疯狂点击,获取是tab栏的快速切换,我们往往需要做一些防止重复提交的操作,好...
    Amy_yqh阅读 4,802评论 0 0
  • areil2me阅读 186评论 0 0
  • 前言 最近在项目中遇到一个问题,在连续发送同一请求时,如果第二次请求比第一次请求快,那么实际显示的是第一次请求的数...
    Wilson998阅读 5,631评论 2 2
  • 在黎明到来前读博尔赫斯 读到奥德赛和俄狄浦斯 读到时空的苍茫和幼发拉底河哺育的兴衰荒凉 他也曾忧虑人们最终忘记他的...
    古月J阅读 445评论 17 35