【发布时间】:2020-08-15 11:22:59
【问题描述】:
** 已编辑/重新措辞 **
在对我的问题进行了一些很好的回答之后,我编辑了问题中的代码,以尽可能清楚地说明我不理解的内容。
我有一个 withErrorHandler 将用作许多单独组件的 hoc。
其中一个组件是 MyComponent。
withErrorHandler 的 componentWillMount 中的代码按预期工作,但由于它是一个废弃的方法,我必须将它移到某个地方。
位置 - ComponentDidMount 拦截器将无法拦截错误。
位置 - 构造函数 拦截器将拦截错误,但 withError 处理程序中的 Modal 不会显示给用户。
这里到底发生了什么?
import React from 'react';
import Modal from '../../components/UI/Modal/Modal';
import Aux from '../Aux/Aux';
const withErrorHandler = (WrappedComponent, axiosInstance) => {
return class extends React.Component {
constructor(props) {
super(props);
this.state= {
error: null
};
}
componentWillMount() {
let { request, response} = axiosInstance.interceptors;
this.requestInterceptor = request.use(req => {
this.setState({error: null});
return req;
})
this.responseInterceptor = response.use(resp => resp, error => {
console.log("axiosInstance Intercepted Error\t",error)
this.setState({error})
})
}
componentWillUnmount() {
let { request, response} = axiosInstance.interceptors;
request.eject(this.requestInterceptor);
response.eject(this.responseInterceptor);
}
errorConfirmedHandler = () => {
this.setState({error: null})
}
render() {
return <Aux>
<Modal show={this.state.error} modalClosed={this.errorConfirmedHandler}>
{this.state.error ? this.state.error.message : null}
</Modal>
<WrappedComponent {...this.props} />
</Aux>
}
}
}
export default withErrorHandler;
import React, { Component } from 'react';
import axiosInstance from '../../AxiosInstance';
import Spinner from '../../components/UI/Spinner/Spinner';
import withErrorHandler from '../../hoc/withErrorHandler/withErrorhandler';
class MyComponent extends Component {
constructor(props) {
super(props);
this.state = {
ingredients: null,
error: false
}
}
componentDidMount() {
// Deliberately placed Error in 'ingredients.json' by removing n
axiosInstance.get('ingredients.jso').then(response => {
this.setState({
ingredients: response.data
})
}).catch(error => {
console.log(`Unable to load Ingredients\nError:\t${JSON.stringify(error, null, 2)}`)
this.setState({ error: true})
})
}
render() {
return (
this.state.ingredients ?
<p>show ingredients</p> :
this.state.error ? <p>Ingredients Can't be loaded</p> : <Spinner />
);
}
}
export default withErrorHandler(MyComponent, axiosInstance);
【问题讨论】:
-
您只能在已安装或正在安装的组件上调用 setState,您可能调用它太快了(例如,回调在生命周期中很快触发)。使用
componentDidMount() -
检查您对
this的引用是否没有丢失。用 this 绑定 Promise。
标签: javascript reactjs react-native constructor setstate