反应:axios.interceptors无法正常工作

时间:2020-02-13 08:09:08

标签: javascript reactjs axios interceptor react-hoc

hoc withErrorHandler中的

axios.interceptors适用于App.js中的单击方法,但不适用于App.js中的componentWillMount或componentDidMount。我该如何解决?

App.js

class App extends Component {
  componentDidMount() {
    axios.get('https://wrongaddress')
        .then(response => {
          console.log(response);
        });
  }

  clicked() {
      axios.get('https://wrongaddress')
          .then(response => {
              console.log(response);
          });
  }

  render() {
    return (
        <button onClick={this.clicked}>btn</button>
    );
  }
}
export default withErrorHandler(App, axios);

hoc / withErrorHandler.js

const withErrorHandler = ( WrappedComponent, axios ) => {
    return class extends Component {
        componentDidMount() {
            axios.interceptors.request.use(req => {
                console.log(req);
                return req;
            });
        }

        render() {
            return (
                <WrappedComponent {...this.props} />
            );
        }
    }
};

1 个答案:

答案 0 :(得分:1)

在第一个渲染之后,将拦截器添加到临时对象中。然后在App的componentWillMount中使用axios。 componentWillMount在第一个渲染之前。

我建议将axios调用放在App中的componentDidMount上。无论如何,建议将所有副作用(如加载数据)放入componentDidMount中。在此处查看文档:{​​{3}}

class App extends Component {
  componentdidMount() {
    axios.get('https://wrongaddress')
        .then(response => {
          console.log(response);
        });
  }

...

您还可以将HOC中的拦截器处理移至componentWillMount。

const withErrorHandler = ( WrappedComponent, axios ) => {
    return class extends Component {
        componentWillMount() {
            axios.interceptors.request.use(req => {
                console.log(req);
                return req;
            });
        }