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)
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值